>백엔드 개발 >C++ >C 파일 입력 스트림을 사용할 때 이중 읽기 줄을 방지하려면 어떻게 해야 합니까?

C 파일 입력 스트림을 사용할 때 이중 읽기 줄을 방지하려면 어떻게 해야 합니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-15 13:28:16231검색

How Can I Avoid Double-Reading Lines When Using C   File Input Streams?

파일 입력에 대한 스트림 상태 테스트: 이중 읽기 방지

파일에서 데이터를 읽을 때 같은 줄을 여러 번 읽는 것을 피하는 것이 중요합니다. 타임스. 그러나 읽기 전에 good() 또는 !eof()와 같은 스트림 상태를 확인하면 예기치 않은 동작이 발생할 수 있습니다.

다음 코드를 고려하세요.

ifstream f("x.txt");
string line;
while (f.good()) {
  getline(f, line);
  // Use line here.
}

이 코드는 모든 줄을 읽는 데 사용됩니다. 파일에서 끝에 도달할 때까지. 그러나 마지막 줄을 두 번 읽습니다. 그 이유를 이해하려면 스트림 상태 플래그의 내부를 조사해야 합니다.

스트림 상태 플래그

good(), eof(), failure() 및 bad()는 입력 스트림의 현재 상태를 나타내는 스트림 상태 플래그입니다. good() 플래그는 일반적으로 스트림이 추가 읽기에 유효한 상태인지 여부를 나타내는 것으로 예상되지만 엄밀히 말하면 정확하지는 않습니다. 오류가 없거나 파일 끝의 조건이 없다는 것이 더 정확하게 설명됩니다.

good() 및 !eof()의 문제

스트림을 확인할 때 .good() 또는 !stream.eof() 읽기 전에 다음 읽기 작업이 성공할지 스트림에 묻지 않습니다. 현재 상태만 쿼리하고 있습니다.

예를 들어 파일에서 마지막 줄을 읽으면 eof() 플래그가 설정됩니다. 그러나 good() 플래그는 여전히 true일 수 있으며, 이는 마지막 읽기 중에 오류가 발생하지 않았음을 나타냅니다.

해결책

이중 읽기를 방지하려면 올바른 접근 방식은 다음과 같습니다. 읽기 작업 후 스트림을 테스트합니다.

// Read all lines from a file
for (std::string line; getline(f, line);) {
  process(line);
}

// Read an integer and store it in foo
int foo;
if (f >> foo) {
  use(foo);
} else {
  handle_error();
}

이 접근 방식을 사용하면 스트림에서 성공적으로 읽은 데이터만 처리할 수 있습니다. 파일.

위 내용은 C 파일 입력 스트림을 사용할 때 이중 읽기 줄을 방지하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.