老牛来学习 发表于 2020-4-20 21:23:36

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;
}

superbe 发表于 2020-4-20 22:33:16

\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:11:14

本帖最后由 jkluoling1992 于 2020-4-21 00:16 编辑

fprintf 输入1,2,3 分别到文件中,然后在输入一个换行符
然后在输入4,5,6分别到文件中,再输入一个换行符,
,fscanf遇到空格和换行时结束
fscanf是把这些文件中的两行数字分别赋给了k,n,因为遇到换行符就结束了,所以赋值的时候就把123(连续地址)赋给了&k指向的地址空间,把456(也是连续地址)赋给了&n指向的地址空间,所以最后看到的不是k=123456

老牛来学习 发表于 2020-4-21 08:47:14

jkluoling1992 发表于 2020-4-21 00:11
fprintf 输入1,2,3 分别到文件中,然后在输入一个换行符
然后在输入4,5,6分别到文件中,再输入一个换 ...

刚试了一下,好像你是对的... 最佳答案给错人了

老牛来学习 发表于 2020-4-21 08:48:11

superbe 发表于 2020-4-20 22:33
\0结束是针对%s来说的,而这里是%d。

将123456写入fp后,文件内容是这样的:


那按照你说的,我将\n换成n,之后发现值会改变

jkluoling1992 发表于 2020-4-21 08:50:26

老牛来学习 发表于 2020-4-21 08:47
刚试了一下,好像你是对的... 最佳答案给错人了

哈哈哈,没事,就当共同学习咯

superbe 发表于 2020-4-21 15:08:57

本帖最后由 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的值是无效的值。
和我上面说的不矛盾吧。

老牛来学习 发表于 2020-4-21 15:23:36

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:17:55

本帖最后由 superbe 于 2020-4-21 16:19 编辑

正常输入时我们经常用空格隔开每个数,或者是每个数后面一个回车。这是不出错的情况,所以可以说遇到空格和\n结束。
但有时要考虑非法输入,例如整数输入的是123abc,整数得到值123,把后面的abc留在缓冲区,如果不清除掉,后面输入别的数就不正确。
所以说%d是遇到非数字就结束,这包括了遇到空格和\n的情况。

老牛来学习 发表于 2020-4-21 16:33:26

superbe 发表于 2020-4-21 16:17
正常输入时我们经常用空格隔开每个数,或者是每个数后面一个回车。这是不出错的情况,所以可以说遇到空格和 ...

感谢
页: [1]
查看完整版本: C语言