关于文件的输入和输出
时间:2011-12-20
来源:互联网
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
FILE *fp;
char buf[20];
char ch;
if((fp = fopen(argv[1],"a+")) == NULL)
{
puts("can't open this file");
exit(1);
fprintf(fp,"%s","oh, my god");
fp = fopen("my.txt", "r+");
fgets(buf, 20,fp);
puts(buf);
while((ch = getc(fp)) != EOF)
{
putchar(ch);
}
return 0;
}
这个程序运行时输入: chp13 my.txt
可以生成一个文本文档,里面也有字符串。
但是
1)我不明白为什么要加这句 fp = fopen("my.txt", "r+"); 如果不加这句,后面的puts(buf)就没有显示。但是fp = fopen(argv[1],"a+")这句不是“打开一个文本文件,可以进行更新(读取和输入)”么?
2)这个程序第一次运行时,显示的是几个乱码,但是第二次运行(即my.txt已经存在了)puts(buf)就正确了。这是怎么回事啊?
3)将fp = fopen(argv[1],"a+")中的a改成w时,puts(buf)就显示乱码。这是怎么回事啊?
4)while((ch = getc(fp)) != EOF)
{
putchar(ch);
}
这段就没正常显示过。。。。
这都折腾一下午了,刚学文件的输入与输出,求各位大大赐教
作者: citylove 发布时间: 2011-12-20
你定义了文件描述符fp 后面定义了 覆盖了前面的 所以就是那个my.txt
w 打开只写文件, 若文件存在则文件长度清为0, 即该文件内容会消失。若文件不存在则建立该文件。
a+ 以附加方式打开可读写的文件。若文件不存在, 则会建立该文件, 如果文件存在, 写入的数据会被加到文件尾后, 即文件原先的内容会被保留。
fgets 是每次读一行
getc()返回的是int 是不是要强制转换 while((char)ch = getc(fp) )
你可能函数原型什么的没搞清楚 多看看
也不晓得你啥子意思
作者: ilubuntu 发布时间: 2011-12-20
既然要从文件里面读刚写进去的内容,最好用下这个函数fflush() 先将之前的输出强制写到文件中;
还有,最好理解下fopen() , fclose() 这些函数用法 ;
写程序的时候逻辑先正确;
作者: liuliufen 发布时间: 2011-12-20
我表示程序有错误啊
你定义了文件描述符fp 后面定义了 覆盖了前面的 所以就是那个my.txt
w 打开只写文件, 若文件存在则文件长度清为0, 即该文件内容会消失。若文件不存在则建立该文件。
a+ 以附加方式打开可读写的文件。若文件不存在, 则会建立该文件, 如果文件存在, 写入的数据会被加到文件尾后, 即文件原先的内容会被保留。
fgets 是每次读一行
getc……
因为我输入的第二个参数就是my.txt,这样不会覆盖的吧?
我运行了几次,然后有个猜测,不知道对不对
如果在程序中第一次新建一个my.txt,那么就不能立即将它里面的内容读出来
还有,
while((ch = getc(fp)) != EOF)
{
putchar(ch);
}
这个之前应该加rewind(fp);就可以正确显示了
作者: citylove 发布时间: 2011-12-20
文件打开一次就行了,为什么要再次打开?
既然要从文件里面读刚写进去的内容,最好用下这个函数fflush() 先将之前的输出强制写到文件中;
还有,最好理解下fopen() , fclose() 这些函数用法 ;
写程序的时候逻辑先正确;
我只是想练习这几个函数的用法而已,没什么具体的目的。但是根据你的建议,我把程序更新如下:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
FILE *fp;
char buf[20];
int ch;
if((fp = fopen(argv[1],"a+")) == NULL)
{
puts("can't open this file");
exit(1);
}
fprintf(fp,"%s","oh, my god");
fp = fopen(argv[1], "r+");
while((ch = getc(fp)) != EOF)
{
putchar((char)ch);
}
return 0;
}
至于你说为什么我为什么打开两次文件。那是因为如果没有第二次的打开,后面就木有显示啊!!我也不知道为什么。这个代码是完整的,你可以自己运行一下。要是你弄明白了,告诉我一下
谢拉
作者: citylove 发布时间: 2011-12-20
个人看法你第二次打开实现的是将原文件清0,然后打开的。
作者: fengskill 发布时间: 2011-12-20
WIN32下文件读取是通过缓冲区的,你先fflush刷新下缓冲区试试,估计不用2次打开。
个人看法你第二次打开实现的是将原文件清0,然后打开的。
我在while前加了fflush(fp);但是没用啊
如果将第二个打开注释掉,就什么都没有显示了啊
作者: citylove 发布时间: 2011-12-20
WIN32下文件读取是通过缓冲区的,你先fflush刷新下缓冲区试试,估计不用2次打开。
个人看法你第二次打开实现的是将原文件清0,然后打开的。
个人认为,打开的时候是有权限设置的,第一次是在文件里写,第二次是读文件
作者: citylove 发布时间: 2011-12-20
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28