파일에서 한 줄을 읽으려면이 함수를 작성했습니다.
const char *readLine(FILE *file) {
if (file == NULL) {
printf("Error: file pointer is null.");
exit(1);
}
int maximumLineLength = 128;
char *lineBuffer = (char *)malloc(sizeof(char) * maximumLineLength);
if (lineBuffer == NULL) {
printf("Error allocating memory for line buffer.");
exit(1);
}
char ch = getc(file);
int count = 0;
while ((ch != '\n') && (ch != EOF)) {
if (count == maximumLineLength) {
maximumLineLength += 128;
lineBuffer = realloc(lineBuffer, maximumLineLength);
if (lineBuffer == NULL) {
printf("Error reallocating space for line buffer.");
exit(1);
}
}
lineBuffer[count] = ch;
count++;
ch = getc(file);
}
lineBuffer[count] = '\0';
char line[count + 1];
strncpy(line, lineBuffer, (count + 1));
free(lineBuffer);
const char *constLine = line;
return constLine;
}
이 함수는 파일을 올바르게 읽고 printf를 사용하여 constLine 문자열도 올바르게 읽은 것을 알 수 있습니다.
그러나 다음과 같은 기능을 사용하면 :
while (!feof(myFile)) {
const char *line = readLine(myFile);
printf("%s\n", line);
}
printf는 횡설수설합니다. 왜?
getline()
POSIX 2008의 일부가 그들이 POSIX 2008의 나머지 부분을 지원하지 않는 특히, 그것없이 플랫폼 POSIX-처럼,하지만 POSIX 시스템의 세계 내에서 수 getline()
요즘 꽤 휴대용입니다.
fgets
대신에 사용하십시오fgetc
. 줄 단위 대신 문자 단위로 읽고 있습니다.