C++ 文件加载器问题

C++ 文件加载器问题,c++,C++,我有一个包含作者和书籍列表的文本文件,我需要将其加载到我的程序中,以下是加载方法的代码: void Loader::loadFile(const char* path) { FILE* file = fopen(path, "r"); char* bufferString; while (feof(file) != 1) { fgets(bufferString, 1000, file); printf("%s", bufferSt

我有一个包含作者和书籍列表的文本文件,我需要将其加载到我的程序中,以下是加载方法的代码:

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文件并没有完全打印出来。 我应该做些什么来完成数据?

您有,您有一个指针
缓冲字符串
,但您实际上从未在任何地方使用int点。由于未初始化,其值将是不确定的,并且似乎是随机的,这意味着您将在
fgets
调用中写入未分配的内存

不过,这很容易解决,将其声明为数组,并在调用
fgets
时使用数组大小:

char bufferString[500];
...
fgets(bufferString, sizeof(bufferString), file);

除了上面详述的问题之外,您不应该在(!feof(file))时执行
,否则它将无法按预期工作。原因是在尝试从文件之外读取之前,
EOF
标志不会被设置,从而导致循环从一次迭代到多次

您应该改为执行,例如
while(fgets(…)!=NULL)


您拥有的代码不是很C++,而是使用旧的C函数进行文件处理。相反,我建议您阅读更多关于and的内容,and是一个自动扩展的字符串类,它没有C数组的限制,也不会以同样的方式遭受潜在的缓冲区溢出

然后代码可能看起来像这样

std::ifstream input_file(path);
std::string input_buffer;

while (std::getline(input_file, input_buffer))
    std::cout << input_buffer << '\n';
std::ifstream输入文件(路径);
字符串输入缓冲区;
while(std::getline(输入文件、输入缓冲区))
std::cout读入作为第一个参数传递的指针所指向的内存,
bufferString

但是您的
bufferString
是未初始化的指针(导致未定义的行为):

因此,您需要提供一些可读取的内存,例如,将其设置为数组:

char bufferString[1000];
// that's a bit large to store on the stack

作为旁注:您的代码不是惯用的C++。您使用的是C标准库提供的IO函数,这是可能的,但是使用C++ STL的设备更合适。顺便说一下,不需要做<代码>新的加载()/<代码>,C++中不需要(您来自java后台吗?)相反,只需执行

Loader
char bufferString[1000];
// that's a bit large to store on the stack