尝试使用 fread 读取文本文件时发生 'System.AccessViolationException' 类型的未处理异常
An unhandled exception of type 'System.AccessViolationException' while trying to read a text file using fread
我正在尝试使用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] = ' ';
将有效地将数组截断为单个字节。更改size
和count
参数的顺序以更正此问题。
rc = fread(wspfile,sizeof(wspfile)-1,1, fp);
不正确,因为wspfile
是字符串文字。修改此文字是未定义的行为。使用其他缓冲液,或者可以std::string
。
N3337 2.14.5/12
是否所有字符串文本都是不同的(即存储在非重叠对象中)是实现-定义。尝试修改字符串文本的效果是不确定的。
相关文章:
- 如何在c++中使用system()来运行包含空格的python脚本
- System.InvalidCastException - SQL to C++ - safe_cast<float>
- C++/CLI System.AccessViolation在托管类中调用非托管函数时出现异常
- 来自 Android 应用程序内部的 boost 类型的 boost::wrapexcept<boost::system::system_error> 的未捕获异常
- 程序在使用 system() 启动另一个可执行文件时停止
- 为什么我的 DeviceInformation 对象没有 System.Devices.InterfaceClassGuid 属性?
- 为什么"using System;"不被视为不良做法?
- C++ 合并字符串以'system'函数错误
- System.AccessViolationException:shared_ptr C# .NET 和 C++ 应用程
- 将 Vcl::Controls::TCaption aka (System::UnicodeString) 转换为 co
- 对 boost::system::d etail::system_category_instance 的未定义引用,从
- Python os.system() 返回错误值
- 使用 system() 函数在C++程序中运行 cmd 命令
- 如何使用 C/C++ 和 system() 系统调用以外的其他方法在 Linux 中获取文件功能?
- 在C++中,如何在第一个"system()"结束后执行第二个"system()"?
- system() 无法运行我的程序,因为空间
- How to recover system gcc compiler on centos 6
- 导出 c++ 函数并使用 c# System.AccessViolationException 中的函数
- g++ 中的 system() 函数
- System Verilog DPI - 在 cpp 中运行并行线程,在 SV 中运行另一个并行线程