老牛来学习 发表于 2020-4-21 09:26:10

C语言代码出错(文件)

#include<stdio.h>

int main()
{
    FILE *fp;
    char c;
    int n;
    char ff = "123#";
    fp = fopen("a1.txt","r");
    fputs(ff,fp);
    fclose(fp);

    fp = fopen("a1.txt","r");
    while((c = fgetc(fp))!='#')
    {
      putchar(c);
    }
    fclose(fp);
    fp = fopen("a1.txt","r");
    fscanf(fp,"%d",&n);
    printf("%d\n",n);
    fclose(fp);
}



请问一下是哪里出错了

liuzhengyuan 发表于 2020-4-21 09:28:30

首先,你想要这个代码达到什么效果?

liuzhengyuan 发表于 2020-4-21 09:29:54

本帖最后由 liuzhengyuan 于 2020-4-21 09:32 编辑

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

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

int main()
{
    FILE *fp;
    char c;
    int n;
    char ff = "123#";
    fp = fopen("a1.txt","w");
    fputs(ff,fp);
    fclose(fp);

    fp = fopen("a1.txt","r");
    while((c = fgetc(fp))!='#')
    {
      putchar(c);
    }
    fclose(fp);
    fp = fopen("a1.txt","r");
    fscanf(fp,"%d",&n);
    printf("%d\n",n);
    fclose(fp);
}

sunrise085 发表于 2020-4-21 09:31:12

第9行打开方式不对
你要写文件,却用r模式打开的

老牛来学习 发表于 2020-4-21 09:34:03

liuzhengyuan 发表于 2020-4-21 09:29
你这个是“r”,怎么弄 puts 呢?

#include<stdio.h>

int main()
{
    FILE *fp;
    char c;
    int n;
    char ff = "123#";
    fp = fopen("a1.txt","r");
    fputs(ff,fp);
    fclose(fp);

    fp = fopen("a1.txt","r");
    while((c = fgetc(fp))!='#')
    {
      putchar(c);                                一开始ff是字符123#,将123#给fp,fp里面是字符123#,怎么能赋给整型n??中间的类型转换是怎么进行的?
    }
    fclose(fp);
    fp = fopen("a1.txt","r");
    fscanf(fp,"%d",&n);
    printf("%d\n",n);
    fclose(fp);
}


这就是书上的一个题目,问它输出什么

liuzhengyuan 发表于 2020-4-21 09:34:59

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

不输出

老牛来学习 发表于 2020-4-21 09:35:43

sunrise085 发表于 2020-4-21 09:31
第9行打开方式不对
你要写文件,却用r模式打开的

#include<stdio.h>

int main()
{
    FILE *fp;
    char c;
    int n;
    char ff = "123#";
    fp = fopen("a1.txt","r");
    fputs(ff,fp);
    fclose(fp);

    fp = fopen("a1.txt","r");
    while((c = fgetc(fp))!='#')
    {
      putchar(c);                              一开始ff是字符123#,将123#给fp,fp里面是字符123#,怎么能赋给整型n??中间的类型转换是怎么进行的?
    }
    fclose(fp);
    fp = fopen("a1.txt","r");
    fscanf(fp,"%d",&n);
    printf("%d\n",n);
    fclose(fp);
}

liuzhengyuan 发表于 2020-4-21 09:35:50

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

如果改成 w,那就输出 123123

老牛来学习 发表于 2020-4-21 09:39:03

liuzhengyuan 发表于 2020-4-21 09:35
如果改成 w,那就输出 123123

改了,刚才打错了,中间是怎么转换的呀,问题在代码里

sunrise085 发表于 2020-4-21 09:41:08

老牛来学习 发表于 2020-4-21 09:35


你这两种读文件方式
第一种,while循环,fgetc
fgetc每次读一个字符,遇到#结束
输出:123
第二种:fscanf
fscanf格式化读取,你要读的是一个int那就从前向后读取,读到 123,然后遇到#,#不是数字了,系统就认为能读到的就是123了
输出:123
两部分合起来,就是你看到的123123
若是你写文件的时候#在前,那么fscanf是读不到任何内容的。
你需要好好学习了一下scanf函数(fscanf与之很类似)

liuzhengyuan 发表于 2020-4-21 09:45:23

本帖最后由 liuzhengyuan 于 2020-4-21 09:48 编辑

老牛来学习 发表于 2020-4-21 09:39
改了,刚才打错了,中间是怎么转换的呀,问题在代码里

先输入文件 “123#”,代码说在不等于‘#’的情况下就输出
之后就是 fscanf 再输出,因为scanf 中是 %d 所以只能输入整数
然后在输出输入的内容
输出了两次 所以是 123123

老牛来学习 发表于 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是文件里的,总感觉不一样{:10_251:}

sunrise085 发表于 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就可以将之转为数字,这就是格式化的作用啊。
页: [1]
查看完整版本: C语言代码出错(文件)