在visual c++中的fgets()上接收访问冲突错误
Receiving access violation error on fgets() in visual c++
在Visual studio上运行以下代码时,出现访问冲突错误。也许我正在尝试读取一些我没有分配的指针位置或其他什么,但我似乎找不到问题的确切位置。需要一些帮助。
#include <iostream>
class fileReader
{
public:
FILE *fp;
char** lines;
fileReader()
{
fp = NULL;
}
fileReader(char* path)
{
int j=0;
fp = fopen(path,"r");
if (fp == NULL)
return;
else
{
lines = (char**) malloc(sizeof(char *)*56000);
for (int i=0; i<56000; i++)
lines[i] = (char*)malloc(sizeof(char)*1440);
while ( fgets(lines[j], 1440, fp) )
j++;
fclose(fp);
}
}
};
int main(int argv, char** argc)
{
char* path = "D:\testfile.txt";
fileReader *p = new fileReader(path);
for (int i=0; i<2; i++)
std::cout<<p->lines[i];
return 0;
}
j
上没有超过lines
:中元素数量的保护
while ( fgets(lines[j], 1440, fp) )
j++;
若文件包含的行数超过56000
,则这将访问超出数组的范围。
由于这是C++,您应该考虑使用ifstream
、std::getline()
和std::vector<std::string>
来读取文件。std::vector<std::string>
将为您管理内存分配:
std::vector<std::string> lines;
std::ifstream in("D:\testfile.txt");
if (in.is_open())
{
std::string line;
while (std::getline(in, line))
{
lines.push_back(line);
}
in.close();
}
您没有检查malloc
:的返回值
lines = (char**) malloc(sizeof(char *)*56000);
for (int i=0; i<56000; i++)
lines[i] = (char*)malloc(sizeof(char)*1440);
如果malloc
失败,则返回NULL
。
你试图分配相当多的内存,所以我从那里开始。
如果fopen
失败会发生什么?我看到一些未初始化的指针在这种情况下四处漂浮。在不太可能的情况下,malloc
如果失败,则会有一些空指针,而这些指针不应该是取消引用。你不能确保至少有两行在main
中执行循环之前实际阅读;如果没有,你就是将尝试输出未初始化的数据。更不用说你永远不会释放你分配的内存。
(FWIW:使用您的策略,j
应该是公共的,但fp
可以是本地的至FileReader::FileReader
。)
与此几乎完全等效的方法是使用:
std::vector<std::vector<char> > lines;
// ...
FileReader( char const* path )
: lines( 56000, std::vector<char>( 1440 ) )
{
// ...
}
唯一的区别是对fgets
的调用CCD_ 18。
我可能更喜欢使用std::vector<std::string>
,初始化清空,然后对每行进行推回读取:
FileReader( char const* path )
{
std::ifstream input( path );
std::string line;
while ( std::getline( input, line ) ) {
lines.push_back( line + 'n' );
}
}
简单得多,它解决了你遇到的大多数问题。(实际上,我可能会检查文件是否正确打开分别地如果不能,通常会给出错误消息打开输入,而不是将其视为空文件。)
当然,没有理由在main
中使用new
。只是:
int
main()
{
FileReader file( "D:/testfile.txt" );
for ( size_t i = 0; i != file.lines.size(); ++ i ) {
std::cout << file.lines[i];
}
return std::cout.flush() ? EXIT_SUCCESS : EXIT_FAILURE;
}
相关文章:
- 使用 EvtSetChannelConfigProperty() 函数时出现访问冲突错误
- cv::resize() 失败并出现访问冲突错误(由 NULL> 处的 <struct 引起)
- 将 std::string 作为参数从一个 DLL 传递到另一个 DLL 引发访问冲突错误
- 遵循官方 Direct2D 示例,但出现访问冲突错误
- C++ 抛出读取访问冲突错误,但我不确定为什么。平铺滑块益智游戏
- 为什么我的顶点缓冲区对象出现访问冲突错误?
- 销毁 Box2D 主体 - 读取访问冲突错误
- 编译哈希算法时出现内存访问冲突错误
- 使用glCreateBuffers时发生访问冲突错误
- 访问冲突错误在 (而 (info[x] != ))
- 反转字符串 c++ 时出现访问冲突错误
- 我无法弄清楚此访问冲突错误.有人可以在这里帮助我吗?
- 使用内存访问冲突错误
- 读取字符串的字符时出错-访问冲突错误C++
- 创建链接列表时发生访问冲突错误
- 调试优先级队列程序时出现访问冲突错误
- C++LinkedList错误:访问冲突错误
- 为什么我在用SDL2_ttf填充文本时出现访问冲突错误
- MFC:在工作线程中使用对象的成员函数时获取访问冲突错误
- 在C++中使用Box2D物理退出游戏时出现访问冲突错误