我正在尝试从文件中读取,但我唯一能做的就是使用getline()。
问题在于,阅读整行不适合我。
我的输入文件如下所示:
abc 10 20
bbb 10 30
ddd 40 20
当每行中的第一个单词应保存为字符串,并且后面的数字都作为整数编号。 每行中“单词”之间的分隔符可以是SPACE或TAB。
唯一的解决方案是通过char读取char吗?还是有另一种解决方案吗?
答案 0 :(得分:5)
据说你想要这样的东西:
std::string s;
int v0, v1;
while (in >> s >> v0 >> v1) {
std::cout << "do something with s='" << s << "' v0=" << v0 << " v1=" << v1 << "\n";
}
但是,这并不能确保值全部在一行上。如果您想安排此操作,可能需要使用std::getline()
阅读一行,然后使用std::istringstream
将该行拆分为上述行。
答案 1 :(得分:1)
您可以使用getline()
并让函数返回从getline()
收到的字符串中的每个连续字符。
答案 2 :(得分:1)
对于它的价值,我同意@ Dietmar的回答 - 但我可能会更进一步。从事物的外观来看,每行输入代表某种逻辑记录。我可能会创建一个类来表示该记录类型,并为该类提供operator>>
的重载:
class my_data {
std::string name;
int val1, val2;
friend std::istream &operator>>(std::istream &is, my_data &m) {
std::string temp;
std::getline(is, temp);
std::istringstream buffer(temp);
buffer >> m.name >> m.val1 >> m.val2;
return is;
}
};
您可能需要做一些额外的逻辑,将字符串流中的失败转换传播到您读取原始数据的istream。
在任何情况下,有了这个,您可以(例如)直接从流初始化对象向量:
std::vector<my_data> whatever(
(std::istream_iterator<my_data>(some_stream)),
(std::istream_iterator<my_data>());
答案 3 :(得分:0)
@Dietmar使用运算符&gt;&gt;进行阅读的想法对于每个单个值都很好,但是你仍然有这个问题与结束。
但是,您不必将整行存储在临时字符串中,您可以使用std :: istream :: ignore()进行流式处理和更高效:
bool read_it(std::istream& in, std::string& s, int& a, int& b)
{
if (in >> s >> a >> b) // read the values
in.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // read the newline
return in;
}
答案 4 :(得分:0)
要按字符读取文件,同时保留输入文本格式,可以使用以下命令:
if (in.is_open())
char c;
while (in.get(c)) {
std::cout << c;
}
}
其中in
是类型std::ifstream
的输入流。您可以打开这样的文件,如下所示:std::ifstream in('myFile.txt');
如果您不介意格式化,而是希望全部打印在一行中,那么您可以按照DietmarKühl的建议进行操作。
答案 5 :(得分:-1)
使用fscanf,http://www.cplusplus.com/reference/clibrary/cstdio/fscanf/
fscanf(stream, "%s %d %d", &s, &a, &b);