0

我正在尝试使用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;

}

谢谢,

凡塔齐奥

4

2 回答 2

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

wspfile[rc] = '\0'; 

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

于 2012-08-16T13:26:08.670 回答
0
rc = fread(wspfile,sizeof(wspfile)-1,1, fp);

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

n3337 2.14.5/12

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

于 2012-08-16T13:25:25.033 回答