在C中逐行读取文件

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

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

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循环之后,当我跟踪我的数组的内容时,它中的每个项目都只是文件的最后一行。 我想这是因为我每次只是在数组中放入相同的指针(在那一刻指向不同的行),但最后它将指向最后一行,因此一切都将是最后一行。

我怎么解决我的问题?

ps:我刚刚开始使用C,所以请不要认为我甚至都知道它的基本知识:(

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

你还没有创建一个字符串数组,你已经创建了一个指向字符串数组的指针。 你需要在第2部分中将你的数组malloc为行数*每行的char数。 然后将读取线移动到arrays的每个后续位置。

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

为什么不使用fopen,然后只使用fgets来获取每一行

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

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

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

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

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