에 의해 놓친 나는이 다음 코드 : 그것을 로그 파일에서 라인별로 라인을 읽은 후 작성하도록되어는 fgets - 라인는 fgets
static int const max_len = 1000;
FILE* m_in_log = NULL;
FILE* m_log = NULL;
...
...
bool readLine(char* line, int max_len)
if(!fgets(line, max_len, m_in_log)) {
return false;
}
fputs(line, m_log);
fflush(m_log);
return true;
}
(cpp14), 등 다른 로그 파일에 있습니다.
리눅스에서 실행되는 복잡한 다중 스레드 시스템의 한 부분이며 m_in_log
입력은 FIFO입니다.
가정하자 m_in_log
에 포함 된 다음 줄 :
AAA
BBB
CCC
DDD이 코드를 여러 번 실행하면
, 뭔가는 라인이 골대를 벗어났습니다
EEE
하지만 출력 로그 파일 난 단지
EEE
의미는 fgets가 중간에 3 개 라인을 읽는 놓친
AAA를 참조 (나는 알고 이 라인이 FIFO로 보내 졌기 때문에 FIFO에서 다른 파일로
은 (운이없이) 몇 시간 동안이 문제를 고민 한 후 나는tee
을 보내고이 파일에서 모든 5 라인 s는 쓰여진다).std
방법을 사용하기로 결정 :fgets => std::fgets fputs => std::fputs fflush => std::fflush
을하고 그것을 해결하는 문제처럼 보인다.
std
방법으로이 문제를 해결할 수있는 이유를 설명해주세요.
줄을 버리는 '티'과정이 아니라는 것을 어떻게 아시나요? –
나는 그것에 대해 생각하지만, 또한 표준을 사용하여 티를 사용합니다 : : fgets –
당신은 멀티 쓰레딩 언급, 거기에 로그 읽기/쓰기 동시 액세스 무엇입니까? 그렇지 않다면 fgetc/fputc를 사용하여 개별 문자를 읽으면 어떻게되는지 확인하십시오. DOS/UNIX 스타일의 줄 끝이 혼합되어있는 줄 끝 문제가있을 수도 있습니다. –