2

私は、コンピューター サイエンス クラスのプロジェクトに取り組んでいます。コードを書き、MinGW を使用してテストしたところ、問題なく動作しました。次に、コードを大学の Linux サーバーにコピーし、そこでテストしました。これは、私の教授が課題の採点を行っているためです。出力は非常に異なります-出力の途中で改行が出力されたようです。

興味深いことに、この問題は Cygwin GCC (32 ビット、4.7.2) でコンパイルおよび実行した場合にも発生します。なぜこれが起こっているのか、それを修正する方法について誰かが洞察を持っていますか?

コードサンプル入力ファイル(lifepath.txt という名前を付け、実行可能ファイルと同じディレクトリに配置します)。

#include <iostream>
#include <fstream>
#include <map>
#include <set>
#include <string>
#include <cstdlib>

using namespace std;

bool younger(string s1, string s2) {
    string y1 = s1.substr(s1.rfind('-')+1);
    string y2 = s2.substr(s2.rfind('-')+1);

    if(y1 < y2) return true;
    else if(y1 > y2) return false;

    string m1 = s1.substr(s1.find('-')+1, s1.rfind('-')-s1.find('-')-1);
    string m2 = s2.substr(s2.find('-')+1, s2.rfind('-')-s2.find('-')-1);

    if(m1 < m2) return true;
    else if(m1 > m2) return false;

    string d1 = s1.substr(0, s1.find('-'));
    string d2 = s2.substr(0, s2.find('-'));

    return d1 < d2;
}

int main() {
    ifstream in("lifepath.txt");
    map<int, int> pathcounts;
    set<string> bdays;
    string oldest, youngest;

    map<string, int> years;

    string line;
    while(getline(in, line)) {
        string monthday = line.substr(0, line.rfind('-'));
        bdays.insert(monthday);
        string num = line;
        while(num.find('-') != string::npos) num.erase(num.find('-'));
        int path = atoi(num.c_str()) % 9 + 1;
        pathcounts[path]++;

        if(youngest == "" || younger(line, youngest)) youngest = line;
        if(oldest == "" || younger(oldest, line)) oldest = line;

        years[line.substr(line.rfind('-')+1)]++;

    }

    for(int i = 1; i <= 9; i++) {
        cout << i << ": " << pathcounts[i] << endl;
    }

    cout << endl;

    cout << "The oldest birthday is " << oldest << endl;
    cout << "The youngest birthday is " << youngest << endl;

    cout << endl;

    cout << "There are " << bdays.size() << " unique birthdays" << endl;

    cout << endl;

    string modeyear = "";
    int modeyearcount = 0;
    for(map<string, int>::iterator it = years.begin(); it != years.end(); it++) {
        if(it->second > modeyearcount) {
            modeyear = it->first;
            modeyearcount = it->second;
        }
        else if(it->second == modeyearcount) modeyear += " " + it->first;
    }

    cout << "The mode of the birthyears is " << modeyear;
    cout << ", appearing " << modeyearcount << " times" << endl;


    return 0;
}

投稿に 2 つ以上のリンクを含めるには十分な担当者がいないため、出力の画像へのリンクを返信として投稿します。

4

1 に答える 1

3

\rこれは、ファイルからデータを読み取って年配列を設定するときに、Windows の場合、異なる行末が行の先頭に移動することを意味するためです。####だけでなく、キーを使用する####\rと、この最後の記号が 中に表示されcoutます。

したがって、コードを変更する必要があります。

years[line.substr(line.rfind('-')+1, 4)]++;
于 2013-10-14T23:52:06.117 に答える