项目欧拉#22 C ++

时间:2013-08-29 15:13:51

标签: c++

我正在解决C ++中的项目euler问题,并且遇到了问题22的代码。下面是我的cpp,我得到的答案是871202730,或者4448太高了。我输出了排序列表并检查了一些名称得分是否正确计算并且我有正确的名称数量。希望这很简单,我只需要一些新鲜的眼睛来看待它。 Link to the question.

#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;
}

1 个答案:

答案 0 :(得分:2)

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

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

如果您喜欢上述内容,输入操作将失败,并且不会正确更新输入字符串。

相反,你应该这样做:

while(inFile.getline(junk, 50, '"') && inFile.getline(name, 50, '"')) { ... }