鱼C论坛

 找回密码
 立即注册
查看: 583|回复: 12

[已解决]C语言代码出错(文件)

[复制链接]
发表于 2020-4-21 09:26:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include<stdio.h>

  2. int main()
  3. {
  4.     FILE *fp;
  5.     char c;
  6.     int n;
  7.     char ff[5] = "123#";
  8.     fp = fopen("a1.txt","r");
  9.     fputs(ff,fp);
  10.     fclose(fp);

  11.     fp = fopen("a1.txt","r");
  12.     while((c = fgetc(fp))!='#')
  13.     {
  14.         putchar(c);
  15.     }
  16.     fclose(fp);
  17.     fp = fopen("a1.txt","r");
  18.     fscanf(fp,"%d",&n);
  19.     printf("%d\n",n);
  20.     fclose(fp);
  21. }
复制代码



请问一下是哪里出错了
最佳答案
2020-4-21 10:13:08
本帖最后由 sunrise085 于 2020-4-21 10:25 编辑
老牛来学习 发表于 2020-4-21 10:05
因为文件使用字符存的,所以他在数据中是按ascii码存的(这个理解对不对啊?)

因为它是ascii吗存的, ...


你理解的有偏差
先说容易理解的问题
scanf和fscanf的差别:scanf是制定从标准输入流(stdin)进行读取,fscanf是从指定输入流进行读取,更多是用于读取文件,但是fscanf也可以从标准输入流读取,fscanf(stdin,"%d",&n)就可以从键盘输入进行读取了

再说读取格式问题
可以认为字符在文件中是以ASCII存储的,但是格式化读取就是要把对应的内容进行格式化啊
你认为从键盘敲进去123就是数字吗?不是!它也是字符键值,但是scanf就可以将之转为数字,这就是格式化的作用啊。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-21 09:28:30 | 显示全部楼层
首先,你想要这个代码达到什么效果?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-21 09:29:54 | 显示全部楼层
本帖最后由 liuzhengyuan 于 2020-4-21 09:32 编辑

你这个是“r”,怎么弄 puts 呢?
  1.    fp = fopen("a1.txt","r");
  2.     fputs(ff,fp);
复制代码


https://fishc.com.cn/forum.php?m ... 477&pid=4612619
把第九行 改成 “w”,w 的意思是写文件(r表示读文件,不对滴)
  1. #include<stdio.h>

  2. int main()
  3. {
  4.     FILE *fp;
  5.     char c;
  6.     int n;
  7.     char ff[5] = "123#";
  8.     fp = fopen("a1.txt","w");
  9.     fputs(ff,fp);
  10.     fclose(fp);

  11.     fp = fopen("a1.txt","r");
  12.     while((c = fgetc(fp))!='#')
  13.     {
  14.         putchar(c);
  15.     }
  16.     fclose(fp);
  17.     fp = fopen("a1.txt","r");
  18.     fscanf(fp,"%d",&n);
  19.     printf("%d\n",n);
  20.     fclose(fp);
  21. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-4-21 09:31:12 | 显示全部楼层
第9行打开方式不对
你要写文件,却用r模式打开的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-21 09:34:03 | 显示全部楼层
liuzhengyuan 发表于 2020-4-21 09:29
你这个是“r”,怎么弄 puts 呢?
  1. #include<stdio.h>

  2. int main()
  3. {
  4.     FILE *fp;
  5.     char c;
  6.     int n;
  7.     char ff[5] = "123#";
  8.     fp = fopen("a1.txt","r");
  9.     fputs(ff,fp);
  10.     fclose(fp);

  11.     fp = fopen("a1.txt","r");
  12.     while((c = fgetc(fp))!='#')
  13.     {
  14.         putchar(c);                                一开始ff是字符123#,将123#给fp,fp里面是字符123#,怎么能赋给整型n??中间的类型转换是怎么进行的?
  15.     }
  16.     fclose(fp);
  17.     fp = fopen("a1.txt","r");
  18.     fscanf(fp,"%d",&n);
  19.     printf("%d\n",n);
  20.     fclose(fp);
  21. }
复制代码


这就是书上的一个题目,问它输出什么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-21 09:34:59 | 显示全部楼层
老牛来学习 发表于 2020-4-21 09:34
这就是书上的一个题目,问它输出什么

不输出
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-21 09:35:43 | 显示全部楼层
sunrise085 发表于 2020-4-21 09:31
第9行打开方式不对
你要写文件,却用r模式打开的
  1. #include<stdio.h>

  2. int main()
  3. {
  4.     FILE *fp;
  5.     char c;
  6.     int n;
  7.     char ff[5] = "123#";
  8.     fp = fopen("a1.txt","r");
  9.     fputs(ff,fp);
  10.     fclose(fp);

  11.     fp = fopen("a1.txt","r");
  12.     while((c = fgetc(fp))!='#')
  13.     {
  14.         putchar(c);                                一开始ff是字符123#,将123#给fp,fp里面是字符123#,怎么能赋给整型n??中间的类型转换是怎么进行的?
  15.     }
  16.     fclose(fp);
  17.     fp = fopen("a1.txt","r");
  18.     fscanf(fp,"%d",&n);
  19.     printf("%d\n",n);
  20.     fclose(fp);
  21. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-21 09:35:50 | 显示全部楼层
老牛来学习 发表于 2020-4-21 09:34
这就是书上的一个题目,问它输出什么

如果改成 w,那就输出 123123
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-21 09:39:03 | 显示全部楼层
liuzhengyuan 发表于 2020-4-21 09:35
如果改成 w,那就输出 123123

改了,刚才打错了,中间是怎么转换的呀,问题在代码里
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-21 09:41:08 | 显示全部楼层


你这两种读文件方式
第一种,while循环,fgetc
fgetc每次读一个字符,遇到#结束
输出:123
第二种:fscanf
fscanf格式化读取,你要读的是一个int那就从前向后读取,读到 123,然后遇到#,#不是数字了,系统就认为能读到的就是123了
输出:123
两部分合起来,就是你看到的123123
若是你写文件的时候#在前,那么fscanf是读不到任何内容的。
你需要好好学习了一下scanf函数(fscanf与之很类似)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-21 09:45:23 | 显示全部楼层
本帖最后由 liuzhengyuan 于 2020-4-21 09:48 编辑
老牛来学习 发表于 2020-4-21 09:39
改了,刚才打错了,中间是怎么转换的呀,问题在代码里


先输入文件 “123#”,代码说在不等于‘#’的情况下就输出
之后就是 fscanf 再输出,因为scanf 中是 %d 所以只能输入整数
然后在输出输入的内容
输出了两次 所以是 123123
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-21 10:05:49 | 显示全部楼层
sunrise085 发表于 2020-4-21 09:41
你这两种读文件方式
第一种,while循环,fgetc
fgetc每次读一个字符,遇到#结束

因为文件使用字符存的,所以他在数据中是按ascii码存的(这个理解对不对啊?)

因为它是ascii吗存的,所以在scanf是用%d输入到n时,不应该将字符123的ascii码转化成10进制输出吗


scanf函数输入的时候是stdin输入的,fscanf是文件里的,总感觉不一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-21 10:13:08 | 显示全部楼层    本楼为最佳答案   
本帖最后由 sunrise085 于 2020-4-21 10:25 编辑
老牛来学习 发表于 2020-4-21 10:05
因为文件使用字符存的,所以他在数据中是按ascii码存的(这个理解对不对啊?)

因为它是ascii吗存的, ...


你理解的有偏差
先说容易理解的问题
scanf和fscanf的差别:scanf是制定从标准输入流(stdin)进行读取,fscanf是从指定输入流进行读取,更多是用于读取文件,但是fscanf也可以从标准输入流读取,fscanf(stdin,"%d",&n)就可以从键盘输入进行读取了

再说读取格式问题
可以认为字符在文件中是以ASCII存储的,但是格式化读取就是要把对应的内容进行格式化啊
你认为从键盘敲进去123就是数字吗?不是!它也是字符键值,但是scanf就可以将之转为数字,这就是格式化的作用啊。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-4 17:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表