【问题标题】:Reading a file line by line in C在C中逐行读取文件
【发布时间】:2010-12-24 01:52:24
【问题描述】:

我正在尝试编写一些代码来打开一个文件,逐行读取其内容并将这些行中的每一行存储到一个数组中。

首先我打开文件并计算行数,每行的长度都是固定的,所以我只是这样做:

    char buf2[LINE_LENGTH];
    int in2 = open("toSend2", O_RDONLY);
    int number_of_lines = 0;

    for (;;)
 {
  char* p2 = buf2;
  int count = read (in2, p2, LINE_LENGTH);
  if (count < 0)
  {
    printf("ERROR");
    break;
  }
  if (count == 0) break; 

  number_of_lines++;

  printf("count: %d \n",count);
  printf("File 2 line : %s", p2);
  printf("\n");

 }
 close (in2);

到目前为止,这很好用,number_of_lines 确实是文件“toSend2”中的行数,而我的每个 printf 都是该文件中包含的行。

现在有了行数,我创建了一个字符串数组,然后我基本上再次遍历整个文件,但是这一次,我想将每一行存储在数组中(可能有更好的方法来查找文件中的行数,但我尝试的一切都失败了!)

    char * array[number_of_lines];
    int b=0;
    int in3=0;
    in3 = open("toSend2", O_RDONLY);
    for (;;)
 {
  char* p3 = buf3;
  int count = read (in2, p3, LINE_LENGTH);
  if (count < 0)
  {
    printf("ERRORRRRRR");
    break;
  }
  if (count == 0) break;


  array[b] = p3;
  b++;

  printf("count: %d \n",count);
  printf("FILE 2 LINEEEEEE : %s", p3);
  printf("\n");

 }  
 close(in3);

这当然行不通:我的每个 printf 都是正确的行加上文件的最后一行,例如,第一个 printf 将是:

FILE 2 LINEEEEEEE : "文件的第一行" “文件的最后一行”

在这个 for 循环之后,当我跟踪数组的内容时,其中的每个项目都只是文件的最后一行。我认为这是因为我每次都只是在数组中放入相同的指针(当时指向不同的行),但最终它会指向最后一行,因此一切都会是最后一行。

我将如何解决我的问题?

p.s.:我刚开始学 C,所以请不要以为我知道关于它的基本知识 :(

【问题讨论】:

    标签: c arrays file line storage


    【解决方案1】:
    • 使用 stdio,即 fopen()fgets()fclose() 来执行 I/O。您没有充分的理由使用低级别的 Posix 样式 I/O。
    • 您需要动态分配每个新行以便将其存储在数组中。您可以使用strdup() 来执行此操作。
    • 请记住,事情可能会出错;文件可能无法打开,行可能无法读入,内存可能无法分配。检查这一点,并采取相应的行动。

    【讨论】:

    • +1 用于使用现有的 C 库函数。没有理由重新发明轮子。
    • 我同意,'f' 函数更简单。但是,使用打开/读取/关闭(因为标准行长)也很有效。
    • 哦,我想我必须使用 open read close 因为分配的上下文:( strdup() 解决了我的问题主要问题,非常感谢!
    • 当它不符合作业的(未公开的)原则时,如何选择它作为正确答案?
    • 好吧,strdup() 解决了我的主要问题,而 Useless 的回答帮助我找到了一种更好的计算行数的方法,并且作为意外的奖励,让我意识到了其他问题背后的原因
    【解决方案2】:

    您还没有创建字符串数组,而是创建了指向字符串数组的指针。您需要在第 2 部分中将您的数组分配为行数 * 每行的字符数。然后将您的读取行移动到数组的每个后续位置。

    [编辑]
    还有一件事.....
    你的字符串是 X 长度。 'C' 字符串不是 X 长度,它们是 X+1 长度 :)
    [/编辑]

    【讨论】:

    • 确实,谢谢你,关于字符串,这解释了行尾那些奇怪的字符,但它们不是问题 :)
    • 哦,但是是的!你很快就会看到。
    【解决方案3】:

    为什么不用fopen,那就用fgets来获取每一行

    【讨论】:

    • 哦,我忘了提到它的作业部分:(
    【解决方案4】:

    您可以使用stat 获取文件大小。然后number_of_lines = stat.st_size/LINE_LENGTH

    如果您不需要以 nul 结尾的字符串,您可以将整个文件读入单个缓冲区。如果你真的想要它们,设置指针数组,或者只使用&amp;buf[n * LINE_LENGTH] 来获取行 n 的开头。

    要打印已知长度的非空终止字符串,您可以使用:

    printf("line %d = '%.*s'\n", n, LINE_LENGTH, &buf[n * LINE_LENGTH]);
    

    如果您想查看实际代码,请在评论中告诉我。

    【讨论】:

    • 确实,玩的不错,非常感谢,我做的修改也帮我找到了导致2行而不是1个错误的错误!
    • 没问题,以 nul 结尾的字符串可能需要一些时间来适应。
    猜你喜欢
    • 2022-01-25
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 2014-06-21
    • 2012-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多