1
C++의 파일에서 한 줄 (첫 번째 줄은 제외)을 읽길 원합니다. 이것을 수행하는 현명한 방법이 있습니까? 이제 getline() 사용을 고려하고 루프에서 계속 진행하지만 가장 최적의 방법 인 것 같습니다. 어떤 아이디어? 인사말파일의 정확한 줄에 C++ 설정 커서
C++의 파일에서 한 줄 (첫 번째 줄은 제외)을 읽길 원합니다. 이것을 수행하는 현명한 방법이 있습니까? 이제 getline() 사용을 고려하고 루프에서 계속 진행하지만 가장 최적의 방법 인 것 같습니다. 어떤 아이디어? 인사말파일의 정확한 줄에 C++ 설정 커서
텍스트 줄은 가변 길이 레코드으로 알려져 있으며 가변 길이 때문에 파일의 주어진 줄에 쉽게 배치 할 수 없습니다.
한 가지 방법은 파일 위치를 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);
}
위의 방법의 단점 중 하나는 파일을 저장할 충분한 메모리가 필요하다는 것입니다.
그러나 파일을 다시 읽을 필요가 없으므로 액세스 시간이 빠릅니다.
모든 최적화와 마찬가지로, 절충안이 관련되어 있습니다.
fseek()를 사용할 수 있습니다. 여기에서 도움을 얻을 수 있습니다. http://www.cplusplus.com/reference/cstdio/fseek/ – IAmBlake
라인 길이가 가변적 인 경우에는 다른 방법으로 읽을 수 없습니다 당신이 원하는 라인에 올 때까지 줄을 서십시오. 길이가 고정되어 있다면'linenumber * linelength'를 찾을 수 있습니다.'linelength'는 줄 바꿈을 포함해야합니다. – Unimportant
죄송합니다, 당신이 가야 할 때 getline해야합니다. 한 번에 한 줄씩 스캔 할 수있는 시스템 수준의 방법은 없습니다. 필요하고 실현 가능한 경우, 파일의 색인을 작성하여 알려진 개행 위치를 바이트 위치로 기록 할 수 있습니다. 물론 우리가하는 일을 모른 채 적절한 답을 줄 수는 없습니다. –