【发布时间】:2014-04-09 07:55:15
【问题描述】:
我目前正在使用 Visual Studio 2008 将软件从 32 位移植到 64 位,我遇到了关于 fread 的问题,该问题在调用时会导致段错误:
这是重现此问题的代码示例:
void somefunction(std::string filepath)
{
FILE* myfile = fopen(filepath.c_str(),"rb"); // returns a valid handle
if (myfile)
{
char* buffer = new char[BUFFER_SIZE+1];
memset(buffer,0,BUFFER_SIZE+1);
fread(buffer,1,BUFFER_SIZE,myfile); // segfault happens here
fclose(f);
}
}
GetError和ferror不报错,编译32位时可以读取文件。不过,在 64 位上输入 fread 时总是会触发段错误。
我尝试了其他几种文件读取方法(使用ifstream 和Qt 的QFile),它们都有效。
不幸的是,fread 在代码中的许多其他地方都使用了,我想知道它在 VS2008 64 位的实现中是否有一些特殊之处,然后再更改使用它的每一位代码。
提前致谢。
【问题讨论】:
-
你能确认this sample from MSDN(实际上是C)不能在你的系统上运行吗?此外,您没有检查
fread的返回值。而且您不需要使用new分配缓冲区。就做char buffer[BUFFER_SIZE+1]; -
看不出这个函数本身有什么问题。你确定你没有在不同的功能中破坏某些东西,而它恰好在这个功能中崩溃了吗? [或者你的例子可能过于简单了?]
-
我已经在各个领域发现了这个问题,但每次都是 fread 的罪魁祸首。由于此代码是封闭源代码产品的一部分,很遗憾我无法显示更大的代码示例:
标签: c++ visual-studio-2008 64-bit libc