我正在开设一个计算机科学课程。我编写代码并使用MinGW测试它,它工作正常。然后我将代码复制到大学的Linux服务器上并在那里进行了测试,因为那是我教授评分的分配。输出非常不同 - 就像它在输出中间打印出一个回车。
有趣的是,在使用Cygwin GCC(32位,4.7.2)编译和运行时也会出现问题。有没有人知道为什么会发生这种情况以及如何解决这个问题?
Code和sample input file(将命名为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;
}
我会发布一个链接到输出图像作为回复,因为我没有足够的代表在帖子中有两个以上的链接。
答案 0 :(得分:3)
这是因为Windows中的不同行结尾\r
意味着只是从文件中读取数据并设置年份数组时才转到行的开头。您使用的是密钥,而不仅仅是####
,而是####\r
,最后一个符号会在cout
期间显示。
所以你需要改变你的代码:
years[line.substr(line.rfind('-')+1, 4)]++;