#include <iostream>
#include <fstream>
#include <conio.h>
using namespace std;
int main()
{
char r;
fstream file1("text.txt", ios::in |ios::binary);
fstream file2("text.txt", ios::out | ios::binary);
r='r';
for(int i=0; i<100; i++)
file2.write((char*)r, sizeof(char));
while(!file1.eof())
{
file1.read((char*)r, sizeof(char));
cout<<r<<"\n";
}
file1.close();
file2.close();
getch();
}
当我在vc ++ 2010中运行此程序时,在运行时出现以下错误:
Unhandled exception at 0x55361f68 (msvcp100d.dll) in file io.exe: 0xC0000005: Access violation reading location 0x00000072.
是什么原因导致此错误?这是在阅读该行时发生的:
file2.write((char *)r,sizeof(char));
我有没有犯错?如果是,请为我指出(提前感谢)。
更新:我仍然没有得到我的预期输出(将(char *)r校正为(char *)&r之后。我得到的输出是:r。我不应该期望从'r'开始显示100个字符吗?如果没有,请提前告诉我原因并谢谢。
除了其他答案,您的代码还存在另一个问题。
流默认情况下执行缓冲的I / O;写入时file1
,您写入的内容可能尚未输出到实际文件中。内容实际上存储在临时缓冲区中以提高效率。写入实际文件是为显式保留的操作flush()
,在close()
调用时,或者文件流超出范围并被破坏时。
代码中的问题是,在直接写入文件流之后,您将执行输入而不确定输出数据是否已写入实际文件。如果您假设已成功将数据从输入文件读取到变量,则可能导致未定义行为。
相互依赖的文件流应该同步。即,当文件流试图从您已写入的同一文件读取时,则必须刷新输出文件流。可以通过将流“绑定”在一起来实现此目的,这可以使用tie()
:
file1.tie(&file2);
当file1
执行输入时,file2
将被刷新,强制将其缓冲区中的数据写入文件。
您遇到的另一个问题是,您没有检查文件流的构造是否正确,或者是否已从中成功读取文件流file1
。您可以使用if()
语句来执行此操作:
std::fstream file1("text.txt", std::ios_base::in | std::ios_base::binary);
std::fstream file2("text.txt", std::ios_base::out | std::ios_base::binary);
char r('r');
if (file1 && file2)
{
file1.tie(&file2);
for (int i = 0; i < 100; ++i)
file2.write(&r, sizeof(char));
while (file1.read(&r, sizeof(char))) {
std::cout << r << std::endl;
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句