我有一个包含作者和书籍列表的文本文件,我需要将其加载到我的程序中,这里是应该加载它的方法的代码:
void Loader::loadFile(const char* path)
{
FILE* file = fopen(path, "r");
char* bufferString;
while (feof(file) != 1) {
fgets(bufferString, 1000, file);
printf("%s", bufferString);
}
}
我在我的主文件中使用它:
int main(int argc, char** argv) {
Loader* loader = new Loader();
loader->loadFile("/home/terayon/prog/parser/data.txt");
return 0;
}
我得到的data.txt文件没有完全打印出来。 我应该怎么做才能完成数据?
答案 0 :(得分:2)
fgets
读入作为第一个参数传递的指针所指向的内存bufferString
。
但是你的bufferString
是一个未初始化的指针(导致未定义的行为):
char * bufferString;
// not initialised,
// and definitely not pointing to valid memory
所以你需要提供一些内存来读入,例如通过使它成为一个数组:
char bufferString[1000];
// that's a bit large to store on the stack
作为旁注:您的代码不是惯用的C ++。您正在使用 C 标准库提供的IO功能,这是可能的,但使用C ++ STL的功能会更合适。
答案 1 :(得分:1)
你有undefined behavior,你有一个指针bufferString
,但你实际上从未在任何地方实现过 point 。由于它未初始化,其值将不确定并且似乎是随机的,这意味着您将在fgets
调用中写入未分配的内存。
虽然很容易解决,但将其声明为数组,并在调用fgets
时使用数组大小:
char bufferString[500];
...
fgets(bufferString, sizeof(bufferString), file);
除了上面详述的问题,你不应该while(!feof(file))
,它不会像你期望的那样工作。原因是在您尝试从文件之外读取之前,EOF
标志未设置,导致循环迭代一次到多次。
你应该做,例如while (fgets(...) != NULL)
你拥有的代码不是非常C ++ - 而是它使用旧的C函数进行文件处理。相反,我建议你阅读更多关于C++ standard I/O library和std::string
的更多内容,这是一个自动扩展的字符串类,它不具有C数组的限制,并且不会受到潜在的缓冲区溢出的影响方式。
代码可能看起来像这样
std::ifstream input_file(path);
std::string input_buffer;
while (std::getline(input_file, input_buffer))
std::cout << input_buffer << '\n';