c逐行读取文件

c逐行读取文件

我编写这个函数是为了从文件中读取一行:

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,我看到Construcline字符串也被正确读取。

但是,如果我使用这个函数,例如:

while (!feof(myFile)) {
    const char *line = readLine(myFile);
    printf("%s\n", line);}

printf输出胡言乱语。为什么?


繁星coding
浏览 706回答 3
3回答

汪汪一只猫

如果您的任务不是创建逐行读取函数,而只是逐行读取文件,则可以使用包含getline()函数(请参阅手册页)。这里):#define&nbsp;_GNU_SOURCE#include&nbsp;<stdio.h>#include&nbsp;<stdlib.h>int&nbsp;main(void){ &nbsp;&nbsp;&nbsp;&nbsp;FILE&nbsp;*&nbsp;fp; &nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;*&nbsp;line&nbsp;=&nbsp;NULL; &nbsp;&nbsp;&nbsp;&nbsp;size_t&nbsp;len&nbsp;=&nbsp;0; &nbsp;&nbsp;&nbsp;&nbsp;ssize_t&nbsp;read; &nbsp;&nbsp;&nbsp;&nbsp;fp&nbsp;=&nbsp;fopen("/etc/motd",&nbsp;"r"); &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(fp&nbsp;==&nbsp;NULL) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(EXIT_FAILURE); &nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;((read&nbsp;=&nbsp;getline(&line,&nbsp;&len,&nbsp;fp))&nbsp;!=&nbsp;-1)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("Retrieved&nbsp;line&nbsp;of&nbsp;length&nbsp;%zu:\n",&nbsp;read); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%s",&nbsp;line); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;fclose(fp); &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(line) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;free(line); &nbsp;&nbsp;&nbsp;&nbsp;exit(EXIT_SUCCESS);}

繁星淼淼

FILE*&nbsp;fp;char&nbsp;buffer[255];fp&nbsp;=&nbsp;fopen("file.txt",&nbsp;"r");while(fgets(buffer,&nbsp;255,&nbsp;(FILE*)&nbsp;fp))&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;printf("%s\n",&nbsp;buffer);}fclose(fp);
打开App,查看更多内容
随时随地看视频慕课网APP