Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么这段代码不指定访问数组的哪个元素? #包括 #包括 文件*fptr; main() { char文件行[100]; fptr=fopen(“C:\\Users\\user\\Desktop\\Summary.h”、“r”); 如果(fptr!=0){ 而(!feof(fptr)){ fgets(fileLine,100,fptr);//_C_Arrays_String - Fatal编程技术网

为什么这段代码不指定访问数组的哪个元素? #包括 #包括 文件*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] */