我尝试使用 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
答案 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()
读取1
个7
字节的项目。如果成功,fread()
将返回1
,因为它返回读取的项目数,而不是字节数。以下一行:
wspfile[rc] = '\0';
会有效地将数组截断为单个字节。更改size
和count
参数的顺序以更正此问题。
答案 1 :(得分:0)
rc = fread(wspfile,sizeof(wspfile)-1,1, fp);
不正确,因为wspfile
是字符串文字。修改此文字是未定义的行为。
使用其他缓冲区,或者可以是std::string
。
n3337 2.14.5 / 12
是否所有字符串文字都是不同的(即存储在非重叠对象中)是实现 - 定义。尝试修改字符串文字的效果未定义。