使用制表符和空格读入文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用制表符和空格读入文件相关的知识,希望对你有一定的参考价值。

我有这种格式的文本文件:

Petroleum Engineering       94600   175500 

Marine Engineering  73900   123200 

Economics and Mathematics   60000   122900 

Geophysics  54100   122200 

Cognitive Science   54000   121900 

我所拥有的是课程名称,平均早期职业薪酬和中期职业薪酬,所有这些都由标签分隔。具有多个单词的课程名称由空格分隔。

我想阅读课程名称并将其放在一个变量中,第一个支付在第二个变量中,第三个支付在第三个变量中。

    int main(){
        ifstream in;
        in.open("Salaries.txt");
        string course;
        int mid;
        int avg;
        if (in.fail()){
        cout<< "failed to open file";
        exit(1);
        }
        while(!in.eof()){
           in >> course >> avg >> mid;
           cout << course<<endl;
        }
      in.close();
     }

当我编译这段代码时,它什么都不输出,程序不会退出或终止。

评论中有人指出不推荐使用eof(),所以我试着这样做:

        while(in >> course >> sm >> lg){     
            cout << course << endl;
       }

该过程退出而不向屏幕输出任何内容。我在输入文件上尝试了它,看起来像这样:

NCORES 1

NEW   0 

CORE   100   
INPUT 5000  
CORE 20

它接受字符串并将其放入一个变量中,然后获取数字并将其放入另一个变量中,并输出正确的输出。所以问题是原始文件中cours名称中的单词之间的空格,我不知道如何解释。

答案

虽然你的代码确实有其他问题,但你遇到的问题是operator>>string在它遇到的第一个空白处停止阅读的事实。这意味着在第一行,它将Petroleum读入course,然后尝试将Engineering读入avg。由于avg是一个数字,这不起作用,因此转换失败。从那里,所有进一步尝试从流读取失败。

要解决这个问题,您可能希望使用std::getline来阅读课程名称。它允许您指定将结束其读取的字符串的字符。在这种情况下,您显然希望为该参数传递制表符(' ')。

如果我这样做,我可能会将这三个项放入一个结构中,并为该结构重载operator>>

struct course {
    std::string name;
    long early_pay;
    long mid_pay;

    friend std::istream &operator>>(std::istream &is, course &c) { 
        if (std::getline(is, c.name, '	')) {
            std::string temp;
            std::getline(is, temp, '	');
            c.early_pay = std::stol(temp);
            std::getline(is, temp);
            c.mid_pay = std::stol(temp);
        }
        return is;
    }
};

然后读取数据并打印出课程名称将如下所示:

int main() {
    std::istringstream input(
R"(Petroleum Engineering    94600   175500 
Marine Engineering  73900   123200 
Economics and Mathematics   60000   122900 
Geophysics  54100   122200 
Cognitive Science   54000   121900 )");

    course c;

    while (input >> c)
        std::cout << c.name << '
';
}
另一答案

使用std::getline()从文件中读取行,并使用std::istringstream来解析每一行。然后,您可以使用std::getline()从每行读取制表符分隔的字符串。例如:

int main() {
    ifstream in("Salaries.txt");
    if (!in.is_open()) {
        cout<< "failed to open file";
        exit(1);
    }

    string line course;
    int mid, avg;

    while (getline(in, line)) {
        istringstream iss(line);
        getline(iss, course, '	');
        iss >> avg >> mid;
        cout << course << endl;
    }

    return 0;
}

以上是关于使用制表符和空格读入文件的主要内容,如果未能解决你的问题,请参考以下文章

将大制表符分隔文件读入R [重复]

无法将制表符分隔的文件读入 numpy 二维数组

awk入门教程及应用场景

Java字符代码中干掉制表符回车符和换行符

C printf

QT5入门之12 - QDebug输出调试信息