所以我正在处理一个我需要阅读的文件,其中包含分隔单词的逗号和每行末尾的回车换行,我无法找到处理它的方法。我试着在逗号之前阅读每个单词并将其放入向量中,直到它碰到回车换行但我遇到了问题。
这是我的文本文件(在记事本++上看到,所以你可以看到符号。在实际文本上,[]中的内容不会出现)
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函数中的所有单词都丢失了,但我不知道如何只读取逗号和回车换行而不使用它。
答案 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))
从文件中读取而不知道它是如何工作的?