C语言
#include<stdio.h>#include<stdlib.h>
int main()
{
FILE *fp;
int k,n,a = {1,2,3,4,5,6};
fp = fopen("d2.dat","w");
fprintf(fp,"%d%d%d\n",a,a,a);
fprintf(fp,"%d%d%d\n",a,a,a); //这两行代码将123456,输入fp
fclose(fp);
fp = fopen("d2.dat","r");
fscanf(fp,"%d%d",&k,&n); //按照我之前问的说是遇到\0停止,\n只是换行,那么应该是将fp里的123456全部输出到k变量里??
printf("%d%d\n",k,n); //之后我试了一下只输出k,只输出了123,所以是fscanf输出时遇到\0或\n都会停止吗??
fclose(fp);
return 0;
}
\0结束是针对%s来说的,而这里是%d。
将123456写入fp后,文件内容是这样的:
123
456
%d输入整数时遇到非数字结束,123后面是\n(不是数字), 读取结束, 所以k的值是123
%d也会跳过开头的空白(空格, \t, \n), 所以下一个%d读n时, 跳过\n, 读取456结束, n的值是456
本帖最后由 jkluoling1992 于 2020-4-21 00:16 编辑
fprintf 输入1,2,3 分别到文件中,然后在输入一个换行符
然后在输入4,5,6分别到文件中,再输入一个换行符,
,fscanf遇到空格和换行时结束
fscanf是把这些文件中的两行数字分别赋给了k,n,因为遇到换行符就结束了,所以赋值的时候就把123(连续地址)赋给了&k指向的地址空间,把456(也是连续地址)赋给了&n指向的地址空间,所以最后看到的不是k=123456 jkluoling1992 发表于 2020-4-21 00:11
fprintf 输入1,2,3 分别到文件中,然后在输入一个换行符
然后在输入4,5,6分别到文件中,再输入一个换 ...
刚试了一下,好像你是对的... 最佳答案给错人了 superbe 发表于 2020-4-20 22:33
\0结束是针对%s来说的,而这里是%d。
将123456写入fp后,文件内容是这样的:
那按照你说的,我将\n换成n,之后发现值会改变 老牛来学习 发表于 2020-4-21 08:47
刚试了一下,好像你是对的... 最佳答案给错人了
哈哈哈,没事,就当共同学习咯 本帖最后由 superbe 于 2020-4-21 15:10 编辑
第8行 fprintf(fp,"%d%d%d\n",a,a,a);
你把第8行的 \n 换成 n 了?是不是k的值没变还是123,但n的值不对了?
k读到字符n就结束了,所以是123,而读n的值是不能跳过字符n,读取失败,n的值是无效的值。
和我上面说的不矛盾吧。
superbe 发表于 2020-4-21 15:08
第8行 fprintf(fp,"%d%d%d\n",a,a,a);
你把第8行的 \n 换成 n 了?是不是k的值没变还是123,但n ...
确实之后试了一下,单独输出k是正常的,但是为啥百度都是说遇到空格和\n结束.。。 本帖最后由 superbe 于 2020-4-21 16:19 编辑
正常输入时我们经常用空格隔开每个数,或者是每个数后面一个回车。这是不出错的情况,所以可以说遇到空格和\n结束。
但有时要考虑非法输入,例如整数输入的是123abc,整数得到值123,把后面的abc留在缓冲区,如果不清除掉,后面输入别的数就不正确。
所以说%d是遇到非数字就结束,这包括了遇到空格和\n的情况。 superbe 发表于 2020-4-21 16:17
正常输入时我们经常用空格隔开每个数,或者是每个数后面一个回车。这是不出错的情况,所以可以说遇到空格和 ...
感谢
页:
[1]