【问题标题】:C++ reading in a file, ignoring commas and outputting data to the screenC ++读取文件,忽略逗号并将数据输出到屏幕
【发布时间】:2015-11-06 00:38:42
【问题描述】:

我有一个格式为: 名字、中间名、姓氏、专业、城市、州、GPA

我正在尝试读取文件并将不带逗号的数据输出到屏幕上。这是我目前所拥有的,但它只输出 GPA:

#include <fstream>
#include <iostream>
#include <string>
#include <sstream>

using namespace std;
int main(){
    string fileline;
    string word;
    ifstream studentData;
    studentData.open("studentData.csv");
    while(studentData){
        getline(studentData,fileline);
        istringstream ss(fileline);
        while(getline(ss, word,','));{
            cout << word << '\n';

        }

    }
    return(0);
}

【问题讨论】:

  • while 中使用getline。你是为第二个循环(虽然停留;)但不是第一个循环。

标签: c++ getline sstream


【解决方案1】:

我认为问题出在这一行:

while(getline(ss, word,','));{

尝试删除分号。这将是正确的方法:

while(getline(ss, word,',')){

分号使循环在读取最后一个单词(我猜是 GPA)之前什么都不做,然后打印出来。

让我们知道这是否有效!

【讨论】:

  • 成功了。目前它在自己的行上打印出每个单词。我试图弄清楚一旦我到达一行的末尾如何只打印到新行,所以它会打印 7 个单词然后开始一个新行。有什么建议吗?
  • 是的。由于 cout 末尾的 \n ,它正在打印一个新行。要打印空格,您可以执行以下操作: while(getline(ss, word,',')){ cout
  • 我想以与开始时相同的格式输出数据,只是不带逗号。如果我使用 ' ' 而不是 '\n' ,它会将找到的每个单词放在一起。 (我应该提到输入文件大约有 27 行)。所以我想打印出 7 个单词然后换行冲洗并重复
【解决方案2】:

while(getline(ss, word, ','); 中的分号不应该存在。也就是说,stringstreams 很慢,我更喜欢这样做。

while(std::getline(studentData, fileline)) {
    std::erase(std::remove(fileline.begin(), fileline.end(), ','), fileline.end());
    std::cout << fileline << '\n';
}

【讨论】:

    【解决方案3】:

    如果你只想复制不带逗号,为什么不直接复制不带逗号?

    ifstream studentData("StudentData.csv");
    
    studentData >> noskipws;
    
    std::remove_copy(std::istream_iterator<char>(studentData),
                     std::istream_iterator<char>(), 
                     std::ostream_iterator(std::cout)
                     ',');
    

    OTOH,如果您的输入除了逗号之外没有任何分隔字段的内容,那么这将产生输出,并且它们都一起运行。您可能更喜欢在字段之间写出一个空格字符:

    std::transform(std::istream_iterator<char>(studentData),
                   std::istream_iterator<char>(),
                   std::ostream_iterator<char>(std::cout),
                   [](char ch) { return ch == ',' ? ' ' : ch; });
    

    这样您仍然有一些东西来帮助跟踪一个字段的结束位置和下一个字段的开始位置。当然,如果您更喜欢制表符而不是空格,您可以将空格更改为制表符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多