为什么这段代码不指定访问数组的哪个元素? #包括 #包括 文件*fptr; main() { char文件行[100]; fptr=fopen(“C:\\Users\\user\\Desktop\\Summary.h”、“r”); 如果(fptr!=0){ 而(!feof(fptr)){ fgets(fileLine,100,fptr);//
作为为什么这段代码不指定访问数组的哪个元素? #包括 #包括 文件*fptr; main() { char文件行[100]; fptr=fopen(“C:\\Users\\user\\Desktop\\Summary.h”、“r”); 如果(fptr!=0){ 而(!feof(fptr)){ fgets(fileLine,100,fptr);//,c,arrays,string,C,Arrays,String,作为fileLine的字符数组被视为字符串 这不是一个行数组,它是一个字符数组。一个char表示一个字符(或者更准确地说是一个字节)。声明char fileLine[100]使其成为一个100个字符的数组。C对于字符串和字符数组没有不同的类型:字符串(例如行的内容)只是一个字符数组,最后一个字符后有一个空字节 在循环的每次运行中,fileLine包含由fgets读取的行。该字符串由put打印出来。对fgets的每次调用都覆盖先前存储在该字符串中的行 请注意,由于fgets保留了终止每一行的换行符
fileLine
的字符数组被视为字符串
这不是一个行数组,它是一个字符数组。一个char
表示一个字符(或者更准确地说是一个字节)。声明char fileLine[100]
使其成为一个100个字符的数组。C对于字符串和字符数组没有不同的类型:字符串(例如行的内容)只是一个字符数组,最后一个字符后有一个空字节
在循环的每次运行中,fileLine
包含由fgets
读取的行。该字符串由put
打印出来。对fgets
的每次调用都覆盖先前存储在该字符串中的行
请注意,由于fgets
保留了终止每一行的换行符,并且put
在打印字符串后添加了一个换行符,因此您将获得双倍行距的输出。如果一行的长度超过99个字符(严格来说,长度也超过99个字节),在每个99个字符的块之后,您将得到一个换行符
char fileLine[100];
如果要存储所有行,则需要一个字符串数组,即一个字符数组
char fileLine[100];
您使用feof
的方式在这里相当尴尬。feof
告诉您上次读取的尝试是否到达文件的末尾,而不是下一次读取的尝试是否会到达文件的末尾。例如,在这里,在读取最后一行后,feof()
为false(因为程序还不知道这是最后一行,所以它必须尝试读取更多);然后fgets
再次运行,并返回NULL
,因为它无法读取任何内容。尽管如此,i
是递增的;之后feof()
返回false,终止循环。因此,i
最终为1加上读取的行数
虽然您可以通过递减i
来解决此问题,但即使在实际程序中,实际工作的方法也是测试fgets
的结果,这也更有意义。您知道,由于fgets
无法读取一行,您已经到达了文件的末尾
char fileLines[42][100];
int i = 0;
while (!feof(fptr)) {
fgets(fileLines[i], 100, fptr);
++i;
}
/* i-1 lines have been read, from fileLines[0] to fileLines[i-2] */
(这是一个玩具般的例子,现实生活中的代码需要动态内存管理和对长行、太多行和读取错误的错误检查。)
fileLine
是数组char fileLine的起始地址[100]
。通过将i
添加到数组中元素的索引开始处,可以访问每个后续元素。我并不完全清楚您不清楚的部分是什么。有关fgets
的工作,请参阅。但是,您似乎被变量名弄糊涂了:fileLine
是n一系列的“行”。不幸的是,这是一个基本的理解错误,很难建议在哪里查找。你有基础学习手册吗?在谈论字节和C/C++语言时要小心,因为一个字节不一定是8位。@wildplasser考虑到这是一个玩具示例,我试图遵循问题中的代码是什么?我可能应该更强烈地指出,fgets
的返回值需要在使用文件行[I]
执行任何操作之前进行测试,但除此之外?错误在于最后一行将包含垃圾(可能是前一行的副本),循环完成后,i
的值会太高。@wildplasser我已经演示了如何正确处理它,即测试fgets
的返回值。但是我不明白“最后一行将包含垃圾”的含义。或者你是指文件行[i-1]
?这不是最后一行,最后一行是(确实令人困惑的)文件行[i-2]
。是的,看起来更好。
char fileLines[42][100];
int i = 0;
while (fgets(fileLines[i], 100, fptr))
++i;
}
/* i lines have been read, from fileLines[0] to fileLines[i-1] */