Saya menulis fungsi ini untuk membaca baris dari file:
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;
}
Fungsi membaca file dengan benar, dan menggunakan printf saya melihat bahwa string constLine juga bisa dibaca dengan benar.
Namun, jika saya menggunakan fungsi misalnya seperti ini:
while (!feof(myFile)) {
const char *line = readLine(myFile);
printf("%s\n", line);
}
printf menampilkan omong kosong. Mengapa?
getline()
adalah bagian dari POSIX 2008. Mungkin ada platform seperti POSIX tanpanya, terutama jika mereka tidak mendukung sisa POSIX 2008, tetapi dalam dunia sistem POSIX, getline()
cukup portabel saat ini.
fgets
sebagai gantifgetc
. Anda membaca karakter demi karakter, bukannya baris demi baris.