1

我正在解决 C++ 中的项目 euler 问题,并且在问题 22 上坚持使用我的代码。下面是我的 cpp,我得到的答案是 871202730,或者 4448 太高了。我已经输出了排序列表并检查了一些名称分数是否计算正确以及我的名称数量是否正确。希望这很简单,我只需要一些新鲜的眼睛来看看它。 链接到问题。

#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <string>
#include <sstream>
using namespace std;

int main() {
    int sum = 0;
    vector<string> names;
    char name[50], junk[5];
    string str;
    ifstream inFile;
    inFile.open("docs/names.txt");

    while(!inFile.eof()) {
        inFile.getline(junk, 50, '/"');
        inFile.getline(name, 50, '/"');
        stringstream sstr;
        sstr << name;
        sstr >> str;
        names.push_back(str);
    }

    sort(names.begin(), names.end());

    for(int i=0; i<names.size(); i++) {
        int namesum = 0;
        for(int j=0; j<names[i].size(); j++)
            namesum += (names[i][j] - 64);
        sum += (namesum*i);
    }

    cout << "Sum: " << sum << endl;
    return 0;
}
4

1 回答 1

2

读取流时,文件结束标志不会设置,直到输入操作尝试读取超出文件末尾并失败。这就是为什么你不能这样做

while (!inFile.eof()) { ... }

如果您这样做,输入操作将失败并且不会正确更新输入字符串。

相反,您应该这样做:

while(inFile.getline(junk, 50, '"') && inFile.getline(name, 50, '"')) { ... }
于 2013-08-29T15:48:56.890 回答