2013-09-27 90 views
0

我想感谢所有帮助我解决问题的人。我终于能够按出生年份安排数据!非常感谢。如果有人能帮助我最后一个问题,那简直太好了从一个文本文件到另一个文本文件的处理线

如果我有一个文本文件,几行是这样的:

1 4:48:08 Orvar Steingrimsson     1979 30 - 39 ara  IS200 
2 4:52:25 Gudni Pall Palsson     1987 18 - 29 ara  IS870 

我怎么能输出这个数据到一个新的文本文件但只列出三件事情:年 - 名字 - 时间......让这两条线路是这样的:

1979 Orvar Steingrimsson 4:48:08 
1987 Gudni Pall Palsson 4:52:25 

我的猜测是这样的:

ifstream in("inputfile.txt"); 
ofstream out("outputfile.txt"); 
int score, year; 
string name, time, group, team; 
while (getline(in,str)); 
in >> score >> time >> name >> year >> group >> team; 
//and then do something like this 
out << year << name << time << '\n'; 

但是我有一种感觉,我将无法循环遍历整个文本文件和所有200行。任何提示赞赏!谢谢

+0

我不会用C++这个 – P0W

+0

这是什么意思?我刚开始一个C++类,我们被要求这样做。今天晚上到期的巨大任务,我无法获得帮助,因为我在UNI中几乎不认识一个人。我知道其他人只是帮助彼此分享代码。但是我必须自己来做这件事,可惜的是,在C++中! –

+0

为什么你要逐一提取第1〜第2〜3〜6行? – P0W

回答

0

“我知道今年是永远的54在每行”

所以第58字符,可以这样考虑:

int main() 
{ 
    ifstream in("laugavegurinn.txt", ios::in); 
    ofstream out("laugavegurinn2.txt"); 
    string str; 
    multimap<int, string> datayear; 

    while (getline(in,str)) { 
     int year = stoi(str.substr(54, 4)); 
     datayear.insert(make_pair(year,str)); //use insert function 
     // multimap don't have [] operator 
      } 

    for (auto v : datayear) 
     out << v.second << "\n"; 

    in.close(); 
    out.close(); 
} 
+0

你是我最好的朋友,是救命恩人。尽管为此工作了大约一周,并在本网站上提出了无数问题,尝试了许多方法并反复阅读我的C++书,但没有任何工作。直到你出现。真诚的,谢谢 –

0

对于初学者,请使用std::getline将行改为std::vector<std::string>, 。然后按照需要的顺序对其进行排序。 然后输出它们。所以main基本上变成三行:

std::vector<Line> data(readLines(inFile)); 
sortByBirthYear(data); 
std::copy(data.begin(), data.end(), std::ostream_iterator<std::string>(outFile, "\n")); 

当然,readLinessortByBirth需要写成 好,但他们都相当微不足道的为好。

或者,更好的可能,你可以定义 一个DataLine类的operator>>,并operator<<和 比较函数(operator<),然后将所有你需要的是:

std::vector<DataLine> data(
    (std::istream_iterator<DataLine>(inFile)), 
    (std::istream_iterator<DataLine>())); 
std::sort(data.begin(), data.end()); 
std::copy(data.begin(), 
      data.end(), 
      std::ostream_iterator<std::string>(outFile, "\n")); 

那是什么我会这样做,但是如果你刚刚开始使用C++,那么你可能不会覆盖必要的基础知识,例如类和运算符 重载。

我还会根据您的代码添加一件事:请勿访问 您输入的数据,而不要首先检查输入 是否成功。

EDIT(只使用基本功能实现):

如上(但没有Line型):

std::vector<std::string> data(readLines(inFile)); 
std::sort(data.begin(), data.end(), orderByBirthYear); 
std::copy(data.begin(), data.end(), 
      std::ostream_iterator<std::string>(outFile, "\n")); 

有:

std::vector<std::string> 
readLines(std::istream& source) 
{ 
    std::vector<std::string> results; 
    std::string line; 
    while (std::getline(source, line)) { 
     results.push_back(line); 
    } 
    return results; 
} 

bool 
orderByBirthYear(std::string const& lhs, std::string const& rhs) 
{ 
    return lhs.compare(54, 4, rhs, 54, 4) < 0; 
} 

但我坚持认为:这是不是如何解决它。任何 合理的解决方案将首先为您的 数据定义一个类,并使用它定义所有操作。这意味着 不仅仅定义了class,还包含了运算符重载;如果您刚刚开始 ,您可能还没有看到任何这些 (并且该作业对于该课程的质量而言不是一个好迹象)。

其余的,你在正确的轨道上;对于面向行的 输入,您应该阅读使用getline。然而,在那之后, 该行已经从输入中提取出来;要进一步解析它, 您需要用它初始化一个std::istringstream,并从中读取 。除了您的输入格式似乎基于 列,因此您可能使用substr函数 std::string来获取单个字段。一旦你有 他们,你会想要去掉前导空白和尾随空白,并且 可能会转换为数字类型(虽然只需排序 年,这是没有必要的)。但是所有这些在逻辑上会在用户定义的operator>>Data类中发生。 (同样,你会提供定义operator<<写 排序的数据出来,而且通常情况下,orderByBirthYear,上面 将是一个类,以及用户。)

+0

是的,刚开始,我们几乎没有涵盖sh **。尽管如此,这是该项目。你能通过定义一个DataLine类来帮助我理解你的意思吗?我知道我需要定义它,如在 class DataLine {...}但是什么? –

+0

@MagnusOttiBenediktsson我无法描述如何在这个论坛上写一个班级;太多了。我已经编写了一份粗略的草案,以便如何在没有任何额外的课程的情况下做到这一点,但这不是在现实生活中做到这一点的方式。 –

相关问题