尝试读入文件时如何处理回车换行符

时间:2018-02-23 03:07:02

标签: c++ string vector getline

所以我正在处理一个我需要阅读的文件,其中包含分隔单词的逗号和每行末尾的回车换行,我无法找到处理它的方法。我试着在逗号之前阅读每个单词并将其放入向量中,直到它碰到回车换行但我遇到了问题。

这是我的文本文件(在记事本++上看到,所以你可以看到符号。在实际文本上,[]中的内容不会出现)

microwave,lamp,guitar,couch,bed,dog,cat[cr][lf]
P1:microwave,couch,bed,dog,chair,bookcase,fish[cr][lf]

我尝试了多种解决方案,但似乎没有任何效果。这是我到目前为止所尝试的。但它显然不起作用。我看到一些用户建议使用substring以某种方式读出逗号,并阅读单词,但我不知道该怎么做。我找不到一个好的教程或一个例子。在我的脑海中,我有算法(或至少,如何去做它的步骤),但我不知道如何实现它。

Import file (istream)

Read until comma, take string and place it in vector1 (getline, input, ,), vector.push_back(input)
Repeat previous step until you reach \cr\lf stop reading. (getline(input, '/r'))

move on to the next line
Read until comma, take string and place it in vector2
Repeat
Read the line until /cr/lf

以下是我使用上述部分步骤实践的代码。

string input;

    vector<string> v1;
    vector<string> v2;


    ifstream infile;

    infile.open("example.txt");

    while(getline(infile, input)) //read until end of line
    {
        while(getline(infile, input, '\r')) //read until it reaches a carriage return
        {
            while(getline(infile, input, ',')) // read until it reaches a comma
            {
                v1.push_back(input);  //take the word and put in vector.

            } 

        }

    }

    infile.close();

任何帮助都将不胜感激。

编辑:我忘了提。当我使用这段代码时,似乎没有将任何东西导入到向量中。我确信在getline函数中的所有单词都丢失了,但我不知道如何只读取逗号和回车换行而不使用它。

1 个答案:

答案 0 :(得分:1)

您应该先使用getline()来获得整行。它应该为你处理回车。然后,将结果放入stringstream并在其上使用getline()分隔逗号处的行。

我的代码将输入读入向量向量:

#include <fstream>
#include <iostream>
#include <sstream>
#include <vector>

int main()
{
    std::ifstream fin("input.txt");
    std::vector<std::vector<std::string>> result;
    for(std::string line; std::getline(fin, line);)
    {
        result.emplace_back();
        std::stringstream ss(line);
        for(std::string word; std::getline(ss, word, ',');)
        {
            result.back().push_back(word);
        }
    }
    for(const auto &i : result)
    {
        for(const auto &j : i)
        {
            std::cout << j << ' ';
        }
        std::cout << '\n';
    }
}

你可以通过删除外部循环来修改它以读入两个向量,并为两个向量/行中的每一个使用两个单独的循环。

在你的代码中,你首先有一个循环,它逐行读取,直到文件结束。读完一行后,你会看到一个循环,直到一个&#39; \ r&#39;就我所知,在普通文本文件中没有出现。即使文件中有&#39; \ r \ n,你也会覆盖刚从外循环中读取的内容。内部循环也是如此。

你是否教过while(getline(fin, str))从文件中读取而不知道它是如何工作的?