#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 *)&amp; r后)。我得到的输出只是:r。我不希望从&#39; r&#39;开始显示100个字符。如果没有,请告诉我原因并提前感谢。
答案 0 :(得分:3)
你需要
file1.read((char*)&r, sizeof(char));
或
file1.read(&r, sizeof(char));
答案 1 :(得分:0)
除了另一个答案之外,您的代码还存在另一个问题。
Streams默认执行缓冲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;
}
}
答案 2 :(得分:-1)
您在写入该文件后立即开始从文件中读取,而不关闭写入文件流。在关闭写文件流之前,它不会提交文字。因此,获取访问权限时会发生更改,因为它拥有控件。
尝试以下代码
#include <iostream>
#include <fstream>
#include <conio.h>
using namespace std;
int main()
{
char *r="r";
fstream file2("text.txt", ios::out | ios::binary);
for(int i=0; i<100; i++)
file2.write((char*)r, sizeof(char));
file2.close();
fstream file1("text.txt", ios::in |ios::binary);
while(!file1.eof())
{
char rr;
file1.read(&rr, sizeof(char));
cout<<rr<<"\n";
}
file1.close();
getch();
}
您尝试将单个字符串转换为char * ,并尝试使用fread读取而不传递r的地址。这就是问题发生的原因。请仔细查看上面的代码,它将解决您的问题。