J'ai écrit cette fonction pour lire une ligne d'un fichier:
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 fonction lit correctement le fichier, et en utilisant printf, je vois que la chaîne constLine a également été lue correctement.
Cependant, si j'utilise la fonction par exemple comme ceci:
while (!feof(myFile)) {
const char *line = readLine(myFile);
printf("%s\n", line);
}
printf produit du charabia. Pourquoi?
getline()
fait partie de POSIX 2008. Il peut y avoir des plates-formes de type POSIX sans elle, surtout si elles ne prennent pas en charge le reste de POSIX 2008, mais dans le monde des systèmes POSIX, getline()
c'est assez portable de nos jours.
fgets
place defgetc
. Vous lisez caractère par caractère au lieu de ligne par ligne.