首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C逐行读取文件

C逐行读取文件
EN

Stack Overflow用户
提问于 2010-08-17 18:08:59
回答 11查看 1M关注 0票数 230

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

代码语言:javascript
复制
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我看到constLine字符串也被正确地读取了。

但是,如果我像这样使用函数:

代码语言:javascript
复制
while (!feof(myFile)) {
    const char *line = readLine(myFile);
    printf("%s\n", line);
}

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

EN

回答 11

Stack Overflow用户

发布于 2010-08-17 19:03:31

如果您的任务不是发明逐行读取函数,而只是逐行读取文件,则可以使用涉及getline()函数的典型代码片段(请参阅手册页here):

代码语言:javascript
复制
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    FILE * fp;
    char * line = NULL;
    size_t len = 0;
    ssize_t read;

    fp = fopen("/etc/motd", "r");
    if (fp == NULL)
        exit(EXIT_FAILURE);

    while ((read = getline(&line, &len, fp)) != -1) {
        printf("Retrieved line of length %zu:\n", read);
        printf("%s", line);
    }

    fclose(fp);
    if (line)
        free(line);
    exit(EXIT_SUCCESS);
}
票数 352
EN

Stack Overflow用户

发布于 2016-08-31 05:47:47

代码语言:javascript
复制
FILE* filePointer;
int bufferLength = 255;
char buffer[bufferLength];

filePointer = fopen("file.txt", "r");

while(fgets(buffer, bufferLength, filePointer)) {
    printf("%s\n", buffer);
}

fclose(filePointer);
票数 59
EN

Stack Overflow用户

发布于 2014-10-23 05:35:47

代码语言:javascript
复制
//open and get the file handle
FILE* fh;
fopen_s(&fh, filename, "r");

//check if file exists
if (fh == NULL){
    printf("file does not exists %s", filename);
    return 0;
}


//read line by line
const size_t line_size = 300;
char* line = malloc(line_size);
while (fgets(line, line_size, fh) != NULL)  {
    printf(line);
}
free(line);    // dont forget to free heap memory
票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3501338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档