在我的代码中,我有一个名为"f1.txt“的文件,该文件中的文本是一个字符串"robin英雄”
我已经创建了一个大小为10的字符串bstr/b和一个文件类型指针变量*fp,然后从fopen函数为这个指针分配我的文件的地址"f1.txt“。
然后我使用了fget函数,它接受这三个参数(字符串、大小、文件指针)。
#include <stdio.h>
void main()
{
char str[10];
FILE *fp;
fp = fopen("f1.txt","r");
if(fp == NULL)
{
printf("File does not exists");
exit(1);
}
while (fgets(str,8,fp)!=NULL){
printf("%s",str);
}
printf("\n");
fclose(fp);
puts(str);
puts(str);
}我提到了8大小,因此它意味着fget将从我的文件中读取前8个字符(robin ),并将其存储到我的字符串中,该字符串的大小为10,剩下的空间仍为2字节。然后,直到我的文件达到空,它复制接下来的8个字符(高英雄)。
所以我想知道: 1.现在还有6个字符,但实际结果是(罗宾·辛格英雄)
下面是代码的实际结果: robin英雄
ro
ro
发布于 2019-08-24 18:43:57
正如您在文件f1.txt包含以下内容的问题中指出的那样
robin singh hero现在当下面的代码被执行时
while (fgets(str,8,fp)!=NULL){
printf("%s",str);
}fgets()从fp指向的文件中读取大小减去一个字符,即7字符,并存储在str中。因此,在第一次迭代中,printf()语句会打印
robin s然后在第二次迭代中,它再次尝试读取7字符,即printf()语句打印
ingh he然后再试着读取7字符,但是只有3字符(如果是\n ),所以printf()语句会打印出来。
ro下面的代码段
printf("\n"); /* prints \n character on console */
fclose(fp); /* closes the file */
puts(str); /* when above while loop terminates str has ro in it, hence it prints ro on console */
puts(str); /* prints ro on console */由于您已经调用了puts()两次,所以它会打印ro两次。
来自fgets()的手册页
fgets()从流中读取最多小于大小的字符,并将它们存储到由s指向的缓冲区中。读取在EOF或换行符之后停止。如果读取换行符,则将其存储到缓冲区中。在缓冲区中的最后一个字符之后存储终止空字节(aq\0aq)。
还请注意,void main() {}不是标准的main()原型。你应该用
int main(void) {
return 0;
}C标准5.1.2.2.1程序启动
1在程序启动时调用的函数名为
main。该实现没有声明此函数的原型。它应定义为返回类型int,且不带参数: (空){/*.*/} 或 有两个参数(这里称为argc和argv,但可以使用任何名称,因为它们是声明它们的函数的本地名称): int main(int argc,char *argv[]) {/*.*/}
https://stackoverflow.com/questions/57640567
复制相似问题