【发布时间】:2013-09-04 14:32:14
【问题描述】:
#include <iostream>
#include <sstream>
#include <fstream>
#include <vector>
#include <string>
int main(int argc, char *argv[])
{
std::vector<std::string> vec;
std::string line;
std::ifstream in(argv[1]);
while(!in.eof()) {
std::getline(in,line);
vec.push_back(line);
}
std::istringstream is;
line = "";
for(auto a:vec) {
for(auto i = a.begin(); i != a.end(); i++) {
if(!(isspace(*i) | ispunct(*i)))
line += *i;
else {
is.str(line);
std::cout << is.str() << std::endl;
line = "";
}
}
}
std::cout << is.str() << std::endl;
return 0;
}
我编写了一个程序,它获取一个文件并将每一行放入一个字符串向量中。然后从元素中一次读取一个单词。
当我从向量中读取时,我无法指定新行。我的输出连接了一行的结尾和下一行的开头。如何指定有新行?
我正在阅读的文件内容:
Math 3 2
Math 4 3
Math 5 4
Phys 3 1
Math 3 1
Comp 3 2
我得到的输出:
Math
3
2Math
4
3Math
5
4Phys
3
1Math
3
1Comp
3
3
编辑::
为了澄清,向量元素的构造是正确的。如果我从 for(auto a:vec) 打印一个 in,它会像文件一样逐行给我。当我尝试从向量中的每个字符构建单词时。我在问我该怎么做才能指定有一个新行,以便
line += a[i]
当它到达一行的末尾时不会继续添加到行。
【问题讨论】:
-
附注:我个人更喜欢使用传统的
for循环而不是for(auto a:vec)以避免使用if(!(isspace(*i) | ispunct(*i))) line += *i;之类的代码:) -
我打算走另一条路:
for (auto c:a)这里非常适合。 -
为了消除另一个冗余,你可以直接吐
line,不需要构造一个stringstream。 -
同志:
std::getline不提供行终止符。提示 #2:在什么情况下你可以从a中读取一个字符而不吐出换行符?提示 #3:尝试在每个输入行的末尾添加一个空格,看看这里发生了什么...... -
for(auto c:a) 打印每个字符。当有空格或标点符号或换行符时,我仍然必须指定不要附加到字符串,我无法弄清楚如何指定。
标签: c++ string parsing io formatting