尝试使用 fread 读取文本文件时发生 'System.AccessViolationException' 类型的未处理异常

An unhandled exception of type 'System.AccessViolationException' while trying to read a text file using fread

本文关键字:System AccessViolationException 类型 异常 未处理 fread 读取 文件 取文本      更新时间:2023-10-16

我正在尝试使用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 %sn", wspfile);
        return -1;
    }   
    rc = fread(wspfile,sizeof(wspfile)-1,1, fp);
    wspfile[rc] = '';
    fclose(fp);
return 0;
}

谢谢

范塔齐奥

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

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()读取1大小为 7 字节的项目。如果此操作成功,fread()将返回1因为它返回读取的项目数,而不是字节数。以下行:

wspfile[rc] = ''; 

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

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

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

N3337 2.14.5/12

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