+ -
当前位置:首页 → 问答吧 → 关于文件的输入和输出

关于文件的输入和输出

时间:2011-12-20

来源:互联网

//文件名 chp13
#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

引用 1 楼 ilubuntu 的回复:

我表示程序有错误啊
你定义了文件描述符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

引用 2 楼 liuliufen 的回复:

文件打开一次就行了,为什么要再次打开?

既然要从文件里面读刚写进去的内容,最好用下这个函数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

WIN32下文件读取是通过缓冲区的,你先fflush刷新下缓冲区试试,估计不用2次打开。
个人看法你第二次打开实现的是将原文件清0,然后打开的。

作者: fengskill   发布时间: 2011-12-20

引用 5 楼 fengskill 的回复:

WIN32下文件读取是通过缓冲区的,你先fflush刷新下缓冲区试试,估计不用2次打开。
个人看法你第二次打开实现的是将原文件清0,然后打开的。

我在while前加了fflush(fp);但是没用啊
如果将第二个打开注释掉,就什么都没有显示了啊

作者: citylove   发布时间: 2011-12-20

引用 5 楼 fengskill 的回复:

WIN32下文件读取是通过缓冲区的,你先fflush刷新下缓冲区试试,估计不用2次打开。
个人看法你第二次打开实现的是将原文件清0,然后打开的。

个人认为,打开的时候是有权限设置的,第一次是在文件里写,第二次是读文件

作者: citylove   发布时间: 2011-12-20