【问题标题】:Read file and save each line to variable in C读取文件并将每一行保存到 C 中的变量
【发布时间】:2013-04-12 01:28:24
【问题描述】:

我正在使用 fgetc 和 fopen 读取 C 中的文件。我想获取变量中的第一行和单独变量中的第二行,如下所示:

f = fopen("textfile", "r");

if (!f) {
   printf("error");
} else {
   loop until end of newline and save entire line to a variable
   1st line ==> line1
   2nd line ==> line2
}

所以如果文本文件有:

hello world
goodbye world

line1 = "你好世界" line2 = "再见世界"

我正在考虑循环直到 \n 但我应该如何存储字符?认为这是一个简单的问题,也许我错过了什么?

【问题讨论】:

    标签: c fopen


    【解决方案1】:
    char line[NBRCOLUMN][LINEMAXSIZE];
    int i =0; int len;
    while (i<NBRCOLUMN && fgets(line[i],sizeof(line[0]),f)) {
        len = strlen(line[î]);
        if(line[len-1] == '\n') line[len-1] = '\0'; // allow to remove the \n  at the end of the line
        i++;
        ....
    }
    

    【讨论】:

    • sizeof(line) 无助于避免缓冲区溢出...此外,除非line 是静态的,否则对于任何合理的NBRCOLUMNLINEMAXSIZE,它将很快导致堆栈溢出。
    • @H2CO3 是 sizeof(line[0]) 而不是 sizeof(line)
    • 现在是。当我写评论时,它不是。
    • @H2CO3 这是一个错字,我在你发表评论的同时修正了
    【解决方案2】:

    你想:

    我。使用fgets() 获取整行,然后

    二。将行存储到char 的数组中。

    char buf[0x1000];
    size_t alloc_size = 4;
    size_t n = 0;
    char **lines = malloc(sizeof(*lines) * alloc_size);
    // TODO: check for NULL
    
    while (fgets(buf, sizeof(buf), f) != NULL) {
        if (++n > alloc_size) {
            alloc_size *= 2;
            char **tmp = realloc(lines, sizeof(*lines) * alloc_size);
            if (tmp != NULL) {
                lines = tmp;
            } else {
                free(lines);
                break; // error
            }
    
            lines[n - 1] = strdup(buf);
        }
    }
    

    【讨论】:

    • @JonathanLeffler:*= 是不是有点难看?
    • 在我看来它比alloc_size &lt;&lt;= 1; 更清晰。你的答案——你的判断。
    • FWIW:我通常使用:size_t new_size = alloc_size * 2;,避免在分配成功之前更新alloc_size;可以说,它使错误恢复更加可靠。您确实使用tmp 以避免丢失引用,但您不会在分配失败时将nalloc_sizelines 设置为0(尽管您可以免费使用lines )。我怀疑这些要点与 OP 没有直接关系,尽管高质量的答案会尽可能避免这种松散的结局(即使没有说明原因)。
    • @JonathanLeffler 没错,但是 1. 这里已经是下午 12 点了 :) 2. 是的,我知道我也应该检查 malloc()strdup() 的返回值,3。不用担心,在我自己的生产代码中,我会注意一些细微的细节,并且我希望 OP 在不了解代码的情况下不要复制粘贴代码(尽管可以通过将 @ 传递给我来更改此行为987654335@ 标志)。而不是// error,也许我应该写// do more proper error handling here(因为这就是我真正的意思)。
    【解决方案3】:
    #include <stdio.h>
    
    int main(int argc, char *argv[]){
        char line1[128];
        char line2[128];
        FILE *f;
    
        f = fopen("textfile", "r");
        if (!f) {
           printf("error");
        } else {
            fscanf(f, "%127[^\n]\n%127[^\n] ", line1, line2);
            printf("1:%s\n", line1);
            printf("2:%s\n", line2);
            fclose(f);
        }
    
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-17
      • 1970-01-01
      • 1970-01-01
      • 2018-02-07
      • 1970-01-01
      • 2018-08-24
      • 2020-08-17
      • 1970-01-01
      相关资源
      最近更新 更多