Ho scritto questa funzione per leggere una riga da un 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;
}
La funzione legge correttamente il file e usando printf vedo che anche la stringa constLine è stata letta correttamente.
Tuttavia, se uso la funzione ad esempio in questo modo:
while (!feof(myFile)) {
const char *line = readLine(myFile);
printf("%s\n", line);
}
printf genera in modo incomprensibile. Perché?
getline()fa parte di POSIX 2008. Potrebbero esserci piattaforme simili a POSIX senza di essa, specialmente se non supportano il resto di POSIX 2008, ma nel mondo dei sistemi POSIX, getline()è abbastanza portatile in questi giorni.
fgetsinvece difgetc. Stai leggendo carattere per carattere anziché riga per riga.