使用文件访问标志和c ++进行文件输入和输出

时间:2014-09-07 23:37:50

标签: c++

假设我在记事本上创建了一个名为Numbers.txt的文档。我将数字6放在记事本上并关闭。然后我输入以下代码段。

#include< iostream>
#include < fstream >

int main()    
{    
  fstream sample;

  sample.open("Numbers.txt", ios::in | ios :: out);

  if(sample)    
  {

     int number;
     sample >> number;
     sample << "555";
    sample.close();
   }
}

因为有时它打印出555,有时它打印出来6.没有一致性。换句话说,输出到底是如何发送到文件的。有人能解释一下原因吗?

2 个答案:

答案 0 :(得分:1)

当您为输入和输出打开文件时,当您在读取和写入该文件之间切换时,必须执行seek。我引用标准来显示在哪里,但引用的引用集得到相当长的时间(一直到C标准)。基本上,它表示读取和写入就像使用了C库中的函数一样,而C标准表示在为两者打开的流上切换输入和输出时需要进行搜索。

答案 1 :(得分:0)

我不知道为什么fstream对你来说并不一致,但是如果你将输入文件流与输出文件流分开,它对我来说是一致的;

<强>的main.cpp

std::ifstream inputFileStream("sample.txt");
std::ofstream outputFileStream("sample.txt",std::ios_base::app); // append to file

if(inputFileStream.good() && outputFileStream.good()){
    int number;
    inputFileStream >> number;
    outputFileStream << "555";

    inputFileStream.close();
    outputFileStream.close();
}

sample.txt 的字符为&#39; 6&#39;在它开始。

这就是它的样子;

c:\Users\James\Desktop>type sample.txt
6
c:\Users\James\Desktop>main

c:\Users\James\Desktop>type sample.txt
6555
c:\Users\James\Desktop>main

c:\Users\James\Desktop>type sample.txt
6555555
c:\Users\James\Desktop>main

c:\Users\James\Desktop>type sample.txt
6555555555

如果你实际上并不想追加,删除那个标志,那么每次没有附加的文件输出只是单个&#34; 555&#34;,这仍然是一致的;

c:\Users\James\Desktop>type sample.txt
6
c:\Users\James\Desktop>main

c:\Users\James\Desktop>type sample.txt
555
c:\Users\James\Desktop>main

c:\Users\James\Desktop>type sample.txt
555
c:\Users\James\Desktop>main

c:\Users\James\Desktop>type sample.txt
555

如果你想知道为什么你对fstream的使用不是比你想要的另一种方式更有效,或者我误解了一些东西,请告诉我,如果是的话,我很乐意删除这个答案并没有真正帮助你。