각 줄에 문자열이있는 텍스트 파일이 있습니다. 텍스트 파일의 각 행에 대해 숫자를 증가시키고 싶지만 파일의 끝에 도달하면 분명히 중지해야합니다. 나는 EOF에 대한 연구를 해보았지만 제대로 사용하는 법을 정말로 이해할 수 없었다.EOF를 사용하여 C에서 텍스트 파일을 실행하는 방법?
나는 while 루프가 필요하다고 가정하고 있지만 어떻게해야할지 모르겠다.
각 줄에 문자열이있는 텍스트 파일이 있습니다. 텍스트 파일의 각 행에 대해 숫자를 증가시키고 싶지만 파일의 끝에 도달하면 분명히 중지해야합니다. 나는 EOF에 대한 연구를 해보았지만 제대로 사용하는 법을 정말로 이해할 수 없었다.EOF를 사용하여 C에서 텍스트 파일을 실행하는 방법?
나는 while 루프가 필요하다고 가정하고 있지만 어떻게해야할지 모르겠다.
EOF 또는 다른 오류가 발생합니다.
fgets()
사용 :
char buffer[BUFFER_SIZE];
while (fgets(buffer, sizeof buffer, stream) != NULL)
{
// process buffer
}
if (feof(stream))
{
// hit end of file
}
else
{
// some other error interrupted the read
}
이 fscanf()
사용 :
char buffer[BUFFER_SIZE];
while (fscanf(stream, "%s", buffer) == 1) // expect 1 successful conversion
{
// process buffer
}
if (feof(stream))
{
// hit end of file
}
else
{
// some other error interrupted the read
}
이 fgetc()
사용 :
int c;
while ((c = fgetc(stream)) != EOF)
{
// process c
}
if (feof(stream))
{
// hit end of file
}
else
{
// some other error interrupted the read
}
이 fread()
사용 :
char buffer[BUFFER_SIZE];
while (fread(buffer, sizeof buffer, 1, stream) == 1) // expecting 1
// element of size
// BUFFER_SIZE
{
// process buffer
}
if (feof(stream))
{
// hit end of file
}
else
{
// some other error interrupted read
}
형식은 모두 동일합니다. 읽기 작업 결과를 확인하십시오. 실패한 경우 다음 EOF를 확인하십시오. feof()
은 끝을지나 읽을 시도한 한 때까지 true를 돌려주지 않기 때문에,
while(!feof(stream))
{
fscanf(stream, "%s", buffer);
...
}
이 양식은 사람들이가하는 생각하는 방법을 작동하지 않는 : 당신은 같은 예를 많이 볼 수 있습니다 파일의 결과적으로 루프는 너무 많은 시간을 하나씩 실행하므로 슬픔이 생길 수도 있고 그렇지 않을 수도 있습니다.
한 가지 가능한 C 루프는 다음과 같습니다
#include <stdio.h>
int main()
{
int c;
while ((c = getchar()) != EOF)
{
/*
** Do something with c, such as check against '\n'
** and increment a line counter.
*/
}
}
는 지금, 나는 feof
과 유사한 기능을 무시합니다. Exprience는 잘못된 시간에 그것을 호출하고 eof가 아직 도달하지 않았다는 믿음으로 두 번 무언가를 처리하는 것이 너무 쉽다는 것을 보여줍니다.
똥구멍을 피해야합니다 : char
을 사용하십시오. c. getchar
은 unsigned char
다음에 int
에 캐스팅 된 다음 문자를 반환합니다. 즉 대부분의 플랫폼에서 EOF
의 값과 c
의 유효한 "char
"값이 중복되지 않으므로 실수로 EOF
을 '정상'인 char
으로 감지하지 않습니다. 결과가 때문이었다 있는지 확인
function result on EOF or error
-------- ----------------------
fgets() NULL
fscanf() number of succesful conversions
less than expected
fgetc() EOF
fread() number of elements read
less than expected
확인 적절한 조건에 대한 입력 호출의 결과가 위, 다음 feof()
전화 : EOF 당신이 스트림을 읽을 때 사용하는 무엇에 따라 어떻게 감지
파일에서 읽은 후 EOF를 확인해야합니다.
fscanf_s // read from file
while(condition) // check EOF
{
fscanf_s // read from file
}
좋은 답변이지만이 제안에 대한 몇 가지 제안은 다음과 같습니다. 1) "함수 : fOFanf() 결과가 EOF 또는 오류 : 예상보다 적은 성공적인 변환 횟수"는 입력 오류와 형식 변환 실패를 동일시합니다. IMO. 다른 열을 제안하십시오. 복잡한 함수입니다. 2) 맞춤법 검사 3) while (! feof (stream)) 예제에 "bad Code"주석을 제안하십시오. – chux