我正在尝试编写一些代码来打开文件,逐行读取其内容并将这些行存储到数组中。
首先我打开文件并计算行数,每行都是固定长度所以我只是这样做:
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,所以请不要假设我甚至都知道它的基本知识:(
答案 0 :(得分:6)
fopen()
,fgets()
和fclose()
来执行I / O.你没有充分的理由使用更低级别的Posix风格的I / O. strdup()
执行此操作。答案 1 :(得分:1)
你还没有创建一个字符串数组,你已经创建了一个指向字符串数组的指针。你需要在第2部分中将你的数组malloc为行数*每行的char数。然后将读取的行移动到数组的每个后续位置。
[编辑]
还有一件事......
你的字符串是X长度。 'C'字符串不是X长度,它们是X + 1长度:)
[/编辑]
答案 2 :(得分:0)
为什么不使用fopen,然后只使用fgets来获取每一行
答案 3 :(得分:0)
您可以使用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]);
如果您想查看实际代码,请在评论中告诉我。