c++ - 输入一定数量后的垃圾值

标签 c++

我一直在努力反对我编写的这个小程序,只是为了测试一些矩阵完成算法。我相信我可能溢出了缓冲区,但我很好奇为什么整个缓冲区都被破坏了。 谢谢你

    MovieRating base[baseNum];
MovieRating test[NUM_RATINGS - baseNum];


//load the base data set
string line ="";
ifstream baseF("assets/u1.base");
ifstream testF("assets/u1.test");
if(baseF.fail()){
    cout << "Unable to open File. Program Terminating..."<<endl;
    return 1;
}

int i = 0;
getline(baseF, line);
while(baseF || i < sizeof(base)){
    base[i] = StringToRating(line);
    i++;
    getline(baseF,line);
}

cout << base[15000].mId << " " << base[15000].uId << " " << base[15000].rating << " " << base[15000].timestamp << endl;
baseF.close();
cout << base[15000].rating << endl;


//load testing dataset
if(testF.fail()){
    cout << "Unable to open File. Program Terminating..."<<endl;
    return 1;
}


i = 0;
getline(testF, line);
while(testF || i < sizeof(test)){
    test[i] = StringToRating(line);
    i++;
    getline(testF,line);
}
testF.close();
cout << base[15000].rating << endl;

GlobalMeanValue(base, test);
return 0;

NUM_RATINGS 为 100,000,baseNum 为 80,000

前两个 cout 的输出是正确的,第三个是加载最后 20,000 个电影评级后的垃圾值。每个 MovieRating 为 16 个字节。

再次感谢

而且我差点忘了这是在 64 位 linux 系统上。

最佳答案

你的问题是双重的,在这一行while(baseF || i < sizeof(base)){ :

首先,您打算使用 &&而不是 ||因此,一旦输入用完,您就完成了。

第二,sizeof(base)是数组的总大小,而不是元素的数量,由 sizeof(base) / sizeof(base[0]) 拥有

关于c++ - 输入一定数量后的垃圾值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17027044/

相关文章:

c++ - 如何获取不以空格结尾的字符串的输入?

c++ - std::unordered_set::reserve 对于容器内存需求的作用?

c++ - QFileSystemModel QTreeView 中某些项目(行)的背景颜色

C++ 读取字符串数组

c++ - 如何重置 QGraphicsView 中的比例?

c++ - 在 [a,b] 间隔之间找到相同的数字

c++ - 用于初始化大 vector vector 的长编译

c++ - 为什么我不能在 vector 迭代器中直接访问?

c++ - 返回 C++ 对象时的复制和销毁

c++ - 如果数据类型不同则进行条件编译