尝试使用fread读取文本文件时,类型为“System.AccessViolationException”的未处理异常

时间:2012-08-16 13:22:48

标签: c++

我尝试使用 fread() 阅读一个简单的文本文件(此处为out.wsp),但我得到了" 未处理的类型' System.AccessViolationException' "的例外情况。我在VS2010 express中遇到这个错误,但是当我在Linux中编译并运行它时它没问题。知道代码有什么问题吗?此外,因为我是C / C ++的新手,还有其他方法可以做这样的事吗?

#include "stdafx.h"

#include <stdio.h>

using namespace std;

 int main(){


    char*  wspfile    = "out.wsp";
    FILE*  fp = NULL;

    fp = fopen( wspfile , "r");
    if(fp == NULL) {
        printf("Error: can not open file %s\n", wspfile);
        return -1;
    }   
    rc = fread(wspfile,sizeof(wspfile)-1,1, fp);
    wspfile[rc] = '\0';
    fclose(fp);

return 0;

}

谢谢,

Fanttazio

2 个答案:

答案 0 :(得分:2)

修改字符串文字是非法的(未定义的行为):

char*  wspfile    = "out.wsp";
...
rc = fread(wspfile,sizeof(wspfile)-1,1, fp); /* sizeof() is a sizeof(char*),
                                                not an array which is probably
                                                what you intended. */

这将是访问冲突的原因。

要解决您可以更改为:

char wspfile[] = "out.wsp";

或者更好的是,对文件名中的内容使用不同的char[]变量。

请注意fread()的签名是:

size_t fread( void *buffer, size_t size, size_t count, FILE *stream );

如果wspfile是一个数组,则发布的代码会要求fread()读取17字节的项目。如果成功,fread()将返回1,因为它返回读取的项目数,而不是字节数。以下一行:

wspfile[rc] = '\0'; 

会有效地将数组截断为单个字节。更改sizecount参数的顺序以更正此问题。

答案 1 :(得分:0)

rc = fread(wspfile,sizeof(wspfile)-1,1, fp);

不正确,因为wspfile是字符串文字。修改此文字是未定义的行为。 使用其他缓冲区,或者可以是std::string

n3337 2.14.5 / 12

是否所有字符串文字都是不同的(即存储在非重叠对象中)是实现 - 定义。尝试修改字符串文字的效果未定义。