使用fstream'访问违规'

时间:2014-05-15 17:08:21

标签: c++ fstream visual-c++-2010

#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个字符。如果没有,请告诉我原因并提前感谢。

3 个答案:

答案 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的地址。这就是问题发生的原因。请仔细查看上面的代码,它将解决您的问题。