`
vvznj72m
  • 浏览: 12413 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

C++中的文件输入/输出(3):掌握输入/输出流

 
阅读更多

C++中的文件输入/输出(3):掌握输入/输出流
2011年06月13日
     Normal  0    7.8 pt  0  2    false  false  false                                          MicrosoftInternetExplorer4    /* Style Definitions */ table.MsoNormalTable {mso-style-name:"Table Normal"; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.0pt; font-family:宋体; mso-ascii-font-family:"Times New Roman"; mso-hansi-font-family:"Times New Roman"; mso-ansi-language:#0400; mso-fareast-language:#0400; mso-bidi-language:#0400;}table.MsoTableGrid {mso-style-name:"Table Grid"; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; border:solid windowtext 1.0pt; mso-border-alt:solid windowtext .5pt; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-border-insideh:.5pt solid windowtext; mso-border-insidev:.5pt solid windowtext; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.0pt; font-family:宋体; mso-ascii-font-family:"Times New Roman"; mso-hansi-font-family:"Times New Roman"; mso-ansi-language:#0400; mso-fareast-language:#0400; mso-bidi-language:#0400;}
  掌握输入/输出流在这一章里,我会提及一些有用的函数。我将为你演示如何打开一个可以同时进行读、写操作的文件;此外,我还将为你介绍其它打开文件的方法,以及如何判断打开操作是否成功。因此,请接着往下读!
  到目前为止,我已为你所展示的只是单一的打开文件的途径:要么为读取而打开,要么为写入而打开。但文件还可以以其它方式打开。迄今,你应当已经认识了下面的方法:
  ifstream OpenFile(“cpp-home.txt”);
  噢,这可不是唯一的方法!正如以前所提到的,以上的代码创建一个类ifstream的对象,并将文件的名字传递给它的构造函数。但实际上,还存在有不少的重载的构造函数,它们可以接受不止一个的参数。同时,还有一个open()函数可以做同样的事情。下面是一个以上代码的示例,但它使用了open()函数:
  ifstream OpenFile;
  OpenFile.open(“cpp-home.txt”);
  你会问:它们之间有什么区别吗?哦,我曾做了不少测试,结论是没有区别!只不过如果你要创建一个文件句柄但不想立刻给它指定一个文件名,那么你可以使用open()函数过后进行指定。顺便再给出一个要使用open()函数的例子:如果你打开一个文件,然后关闭了它,又打算用同一个文件句柄打开另一个文件,这样一来,你将需要使用open()函数。
  考虑以下的代码示例:
  # include
  # include
  using namespace std;
  void read(ifstream &T) { //pass  the file stream to the function
  //the  method to read a file, that I showed you before
  char ch;
  while (!T.eof()) {
  T.get(ch);
  cout read(T);//...
  T.close();
  T.open("file2.txt");
  read(T);//...
  T.close();
  }
  据此,只要file1.txt和file2.txt存在并存储了文本内容,你将看到这些内容。
  现在,该向你演示的是,文件名并不是你唯一可以向open()函数或者构造函数(其实都一样)传递的参数。下面是一个函数原型:
  ifstream OpenFile(char*filename, int open_mode);
  你应当知道filename表示文件的名称(一个字符串),而新出现的则是open_mode(打开模式)。open_mode的值用来定义以怎样的方式打开文件。下面是打开模式的列表:
  名称
  描述
  ios::in
  打开一个可读取文件
  ios::out
  打开一个可写入文件
  ios::app
  你写入的所有数据将被追加到文件的末尾,此方式使用ios::out
  ios::ate
  你写入的所有数据将被追加到文件的末尾,此方式不使用ios::out
  ios::trunk
  删除文件原来已存在的内容(清空文件)
  ios::nocreate
  如果要打开的文件并不存在,那么以此参数调用open()函数将无法进行。
  ios::noreplace
  如果要打开的文件已存在,试图用open()函数打开时将返回一个错误。
  ios::binary
  以二进制的形式打开一个文件。
  实际上,以上的值都属于一个枚举类型的int常量。但为了让你的编程生涯不至于太痛苦,你可以像上表所见的那样使用那些名称。
  下面是一个关于如何使用打开模式的例子:
  #include 
  void  main()
  {
  ofstream SaveFile("file1.txt",  ios::ate);
  SaveFile
  void  main()
  {
  fstream File("test.txt",ios::in  | ios::out);
  File > str;
  cout > str; ―― 这也是新鲜的玩意儿!噢,我确信这行代码让你想起了cin >> .实际上,它们之间有着相当的关联。此行会从文件中读取一个单词,然后将它存入指定的数组变量中。
  例如,如果文件中有这样的文本片断:
  Hi! Do you know me?
  使用File >> str,则只会将”Hi!”输出到str数组中。你应当已经注意到了,它实际上是将空格作为单词的分隔符进行读取的。
  由于我存入文件中的只是单独一个”Hi!”,我不需要写一个while循环,那会花费更多的时间来写代码。这就是我使用此方法的原因。顺便说一下,到目前为止,我所使用的读取文件的while循环中,程序读文件的方式是一个字符一个字符进行读取的。然而你也可以一个单词一个单词地进行读取,像这样:
  char str[30]; // 每个单词的长度不能超过30个字符
  while(!OpenFile.eof())
  {
  OpenFile >>  str;
  cout 输入/输出错误(不是在文件末尾)发生,它将返回非零值。
  我也要讲一些我认为非常重要的内容!例如,如果你已经创建一个流文件对象,但你没有进行打开文件操作,像这样:
  ifstream File; //也可以是一个ofstream
  这样,我们就拥有一个文件句柄,但我们仍然没有打开文件。如果你打算迟些打开它,那么可以用open()函数来实现,我已经在本教程中将它介绍了。但如果在你的程序的某处,你可能需要知道当前的句柄是否关联了一个已经打开的文件,那么你可以用is_open()来进行检测。如果文件没有打开,它将返回0 (false);如果文件已经打开,它将返回1 (true)。例如:
  ofstream  File1;
  File1.open("file1.txt");
  cout 不能当数据库用
  我自己的实践是用指针来输入输出数据比较方便用get()  put()一次只能输入或输出一个字符 用read()  write()要指定写的字符数量 我比较喜欢用重载运算符>
  如:
  #include
  #include
  void main()
  {
  fstream iofile;
  iofile.open("a.txt", ios::in|ios::out);//输入输出类型
  //只要你的机器内存够大 你可以把数组写的更大一次就可以写入很多字符
  char*p=[10000000];
  cin>>p;//写入字符
  iofile>p;//将输入的字符出入到内存给p
  cout输入的字符在屏幕上输出查看 
  iofile.close();
  }
  我是专学语言 对平台操作不会的 呵呵
  ares 发表于2004年12月13日  15:20:00--------------------
  void main(){
  char c;
  while (c!='q' && c!='Q'){
  cout>c;
  }
  } 
  这段代码,如果你输入abcde,它会自动执行5次,
  怎么让它执行一次之后就接受键盘输入?
  weiwenjiangatm@163.com
  等待高手指教
  turkeycock 发表于2006年5月14日  5:26:00--------------------
  表格中对ios::ate的解释不对,使用ate模式会覆盖原来的数据,使用app模式才会在最后追加字符,我使用的visual studio 2003环境编译执行的
  [Lin1]似乎In.seekg(0,ios_base::end);//来到文件末尾
  这样的写法才有效!
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics