使用fgets()从文件读取会导致“从地址读取访问冲突...”c ++

时间:2009-05-13 22:13:06

标签: c++ c file

我正在使用FILE * F在_sfopen()中打开我正在读取文件的同时(!feof(f))然后fgets(str,1024,f)在运行时到达最后一行它仍然会去在那段时间,但是当我试图fgets它飞出一个访问违规恐怖(男人,我只是尝试并抓住(...)但我知道这不是一个好的解决方案)我应该改变什么来解决问题?< / p>

另外 - 如果我想逐行阅读是正确的只是给出1024的大小或它可能会失败 - 我有一个文件,由于它每次从一行中间读取的大小,直到下一行的中间 - 是否有更好的方法来读取一行,因为我不知道我的文件会是什么样子(如果最后有\ n等等......)

谢谢!

2 个答案:

答案 0 :(得分:3)

如果您未在while(!feof(f))之前阅读,那么它就会被破坏,因为EOF标志在 之后才会被设置。而是做这样的事情:

char buf[1024];
while(fgets(buf, sizeof(buf), f)) {
    /* process the line */
}

由于fgets被定义为在读取失败或EOF时返回NULL。

如果你在c ++中这样做,那么我推荐一个类似的模式(但是使用c ++ iostreams)。

std::ifstream file("filename.txt");
std::string line;
while(std::getline(file, line)) {
    // process the line
}

答案 1 :(得分:0)

您将C ++指定为标记,可能使用文件流(std :: ifstream用于从文件输入)和全局getline()函数来逐行获取它并将其放在std :: string中以供进一步分析/操纵。

示例here(“文本文件”段落中的第二个示例)