2016-12-30 6 views
1

C++의 파일에서 한 줄 (첫 번째 줄은 제외)을 읽길 원합니다. 이것을 수행하는 현명한 방법이 있습니까? 이제 getline() 사용을 고려하고 루프에서 계속 진행하지만 가장 최적의 방법 인 것 같습니다. 어떤 아이디어? 인사말파일의 정확한 줄에 C++ 설정 커서

+0

fseek()를 사용할 수 있습니다. 여기에서 도움을 얻을 수 있습니다. http://www.cplusplus.com/reference/cstdio/fseek/ – IAmBlake

+0

라인 길이가 가변적 인 경우에는 다른 방법으로 읽을 수 없습니다 당신이 원하는 라인에 올 때까지 줄을 서십시오. 길이가 고정되어 있다면'linenumber * linelength'를 찾을 수 있습니다.'linelength'는 줄 바꿈을 포함해야합니다. – Unimportant

+0

죄송합니다, 당신이 가야 할 때 getline해야합니다. 한 번에 한 줄씩 스캔 할 수있는 시스템 수준의 방법은 없습니다. 필요하고 실현 가능한 경우, 파일의 색인을 작성하여 알려진 개행 위치를 바이트 위치로 기록 할 수 있습니다. 물론 우리가하는 일을 모른 채 적절한 답을 줄 수는 없습니다. –

답변

1

텍스트 줄은 가변 길이 레코드으로 알려져 있으며 가변 길이 때문에 파일의 주어진 줄에 쉽게 배치 할 수 없습니다.

한 가지 방법은 파일 위치를 std::vector으로 유지하는 것입니다.

const std::streampos line_start = text_line_positions[line_number]; 

편집 : 1 :

std::vector<std::streampos> text_line_positions; 
// The first line starts at position 0: 
text_line_positions.push_back(0); 

std::string text; 
while (std::getline(my_text_file, text)) 
{ 
    const std::streampos position = my_text_file.tellg(); 
    text_line_positions.push_back(position); 
} 

당신은 벡터에서 파일 위치를 검색 할 수 있습니다 벡터 텍스트
더 최적의이 위치의 각 라인을 읽고 녹음 파일을 통해 이동 방법은 각 텍스트 줄을 std::vector으로 읽을 수 있습니다.

std::vector<std::string> file_text; 
std::string text; 
while (std::getline(my_file, text)) 
{ 
    file_text.push_back(text); 
} 

위의 방법의 단점 중 하나는 파일을 저장할 충분한 메모리가 필요하다는 것입니다.
그러나 파일을 다시 읽을 필요가 없으므로 액세스 시간이 빠릅니다.

모든 최적화와 마찬가지로, 절충안이 관련되어 있습니다.