Tôi đã viết chức năng này để đọc một dòng từ một tập tin:
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;
}
Hàm đọc tệp chính xác và sử dụng printf Tôi thấy rằng chuỗi constLine cũng đã được đọc chính xác.
Tuy nhiên, nếu tôi sử dụng chức năng, ví dụ như thế này:
while (!feof(myFile)) {
const char *line = readLine(myFile);
printf("%s\n", line);
}
printf đầu ra vô nghĩa. Tại sao?
getline()
là một phần của POSIX 2008. Có thể có các nền tảng giống POSIX mà không có nó, đặc biệt là nếu chúng không hỗ trợ phần còn lại của POSIX 2008, nhưng trong thế giới của các hệ thống POSIX, getline()
ngày nay rất dễ mang theo.
fgets
thay vìfgetc
. Bạn đang đọc từng ký tự thay vì từng dòng.