2017-04-20 6 views
1

두 줄로 된 텍스트 파일을 사용하고 있습니다. 각 라인에는 수천 개의 숫자가 있습니다 (부호있는 복식). 그래서 그 결과는 다음과 같습니다C++에서 읽을 텍스트 파일의 특정 위치를 요청하는 방법이 있습니까?

X.11 X.12 X.13 ... 
X.21 X.22 X.23 ... 

을 나는 각 라인에서 하나 개의 번호를 읽고 싶어 내 프로그램의 각 루프를 들어. 따라서 루프의 첫 번째 반복에서는 X.11 & X.21이고 두 번째 반복의 경우 X.12 &등이됩니다. 값을 저장할 필요가 없습니다.

예상 출력이는 C++에

X.11 X.21 
X.12 X.22 
X.13 X.23 

을 수행 할 수 있습니까? 나는 보통 fstream을 사용하여 파일을 읽고, 파일을 줄 단위로 std::getline(file, line)으로 읽습니다. 각 줄에서 하나의 번호를 어떻게 읽습니까? 이미 std::getline(file, line)를 사용하여 라인을 읽었다면

+3

X.11 & X.12는 X.11 & X.21이어야합니다. – CIsForCookies

+1

원하는대로 할 수는 있지만 프로그램을 작성하여 전체 파일을 조 변경 한 다음 줄 단위로 읽을 수 있습니다. –

+0

숫자 길이와 줄 길이가 고정되어 있습니까? 이 경우 다음 열의 시작 위치를 계산하고 [seekg] (http://www.cplusplus.com/reference/istream/istream/seekg/)를 사용합니다 (예를 들어 그 원인을 묻는 질문 ...) – urban

답변

1

나는 당신이 필요로하는 가정내가 각 라인에서 하나 개의 번호를 읽고 싶어.
그렇지 않으면 나를 코멘트하십시오; 나는 대답을 지울 것이다.

병렬 2 개 스트림으로 파일을 읽어

std::ifstream input_file_stream_1("file"); 
std::ifstream input_file_stream_2("file"); 

std::string line_1; 
std::string line_2; 
std::string ignore; 
std::getline(input_file_stream_2, ignore); // ignore the whole first line 

for(; input_file_stream_1 >> line_1 && input_file_stream_2 >> line_2;){ 
    std::cout << line_1 << " and " << line_2 << '\n'; 
} 

input_file_stream_1.close(); 
input_file_stream_2.close(); 

입력 :

X.11 X.12 X.13 ... 
X.21 X.22 X.23 ... 

출력 :

X.11 and X.21 
X.12 and X.22 
X.13 and X.23 
... and ... 
,745,151을

어떻게 작동합니까?
파일에 2 줄만 있으므로 같은 파일에 2 개의 input_stream을 사용했습니다. 첫 번째 줄에는 두 번째 줄과 두 번째 줄에 대한 줄 중 하나.그러나 for-loop로 가기 전에. input_file_stream_2은 첫 번째 행을 읽고 input_file_stream_1이 이것을 읽고 싶어하므로이를 사용할 필요가 없습니다. 그래서 그 라인 (첫 번째 라인)을 무시하십시오. input_file_stream_1에는 줄 1이 있고 input_file_stream_2에는 줄 2가 있습니다. 이제 스트림에 두 줄이 있습니다.

std::ifstream input_file_stream("file"); 

std::string line_1; 
std::string line_2; 
std::getline(input_file_stream, line_1); 
std::getline(input_file_stream, line_2); 

std::regex regex(R"(\s+)"); 
std::regex_token_iterator<std::string::iterator> begin_1(line_1.begin(), line_1.end(), regex, -1), end_1; 
std::regex_token_iterator<std::string::iterator> begin_2(line_2.begin(), line_2.end(), regex, -1), end_2; 

while(begin_1 != end_1 && begin_2 != end_2){ 
    std::cout << *begin_1++ << " and " << *begin_2++ << '\n'; 
} 

input_file_stream.close(); 

출력 : (상기와 동일) 그리고 용 루프 (또는 동안) 귀하 >> 연산자


또는 std::regex 라이브러리 각각 텍스트를 추출 할

X.11 and X.21 
X.12 and X.22 
X.13 and X.23 
... and ... 

참고 :
하나 이상의 방법이 있습니다

+0

감사합니다. 첫 번째 방법에서 for 루프를 설명 할 수 있습니까? iterator없이 어떻게 작동합니까? – Hadi

+1

@Hadi 예. 나는 그것을 할 것이다. –

1

, 당신은 당신이 가지고 문자열을, 그리고 char* p = strtok (yourline, " "); 그것을 토큰 화 한 후 * p는 첫 번째 줄에서 X.11를 초래하고, 다음 하나 그냥 다시 strtok를 호출 할 수 있습니다

1

fstream의 경우 tellgseekg을 사용하여 스트림의 위치를 ​​저장하고 복원 할 수 있습니다. 그러나 형식이 지정된 입력과 함께 잘 작동하는지 확인하지 않았습니다.

메모리에 결과를 저장하지 않으려는 경우 다른 해결책은 파일을 두 번 열어 보는 것일 뿐이며 두 개의 서로 다른 파일에서 행을 읽는 것처럼 취급합니다.

2

값을 저장할 필요가 없습니다.

물론, 두 개로 된 두 개의 배열로 말한다면, 루프는 평범한 디스크 읽기보다 쉽고 빠릅니다. 그리고 수천 개의 두 배가되는 배열은 아마도 생각보다 메모리 사용량이 적을 것입니다. 1MB의 RAM에는 131072 개의 8 바이트 2 배가 포함될 수 있습니다.