我正在尝试从文件中读取数据,但是我唯一能够使用的方法是使用getline()。如何在C++中通过字符读取char?
问题是,读一整行不适合我的工作。事后
abc 10 20
bbb 10 30
ddd 40 20
时每行的第一个词应该被保存为一个字符串,这两个数字为整数:
我输入文件看起来像这样。 每行中的“单词”之间的分隔符可以是空格或制表符。
那么唯一的解决方案是通过字符读取char?还是有另一种解决方案?
我正在尝试从文件中读取数据,但是我唯一能够使用的方法是使用getline()。如何在C++中通过字符读取char?
问题是,读一整行不适合我的工作。事后
abc 10 20
bbb 10 30
ddd 40 20
时每行的第一个词应该被保存为一个字符串,这两个数字为整数:
我输入文件看起来像这样。 每行中的“单词”之间的分隔符可以是空格或制表符。
那么唯一的解决方案是通过字符读取char?还是有另一种解决方案?
据说你想是这样的:
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
如上所述分割这一行。
谢谢,终于有人推荐使用流而不是C函数... – 2012-01-29 19:09:14
对于实现[IOStreams自己版本]的人来说,你并不感到惊讶(http://www.dietmar-kuehl.de/cxxrt/ )(是的,它已经过时了,但我正在积极研究更新)推荐使用IOStreams? ;-) – 2012-01-29 19:17:45
我很惊讶没有其他人。 – 2012-01-29 19:18:52
您可以使用getline()
并有一个函数返回从getline()
收到的字符串中的每个连续字符。
使用的fscanf,http://www.cplusplus.com/reference/clibrary/cstdio/fscanf/
fscanf(stream, "%s %d %d", &s, &a, &b);
虽然你不应该这样使用它。至少像这样使用它:'if(fscanf(stream,“%s%d%d”,&s,&a,&b)== 3){...}'。你**总是**想检查输入的结果。此外,请注意,此用法仍然容易出现缓冲区溢出:正在读取的字符串的大小允许为任意大小,但不太可能为任意的所有定义分配了足够的空间。 – 2012-01-29 19:19:30
对于它的价值,我同意@迪特马尔的答案 - 但我可能会走得更远一点。从外观上看,每行输入代表某种逻辑记录。我可能会创建一个类来表示记录类型,并为该类提供的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>());
想法从@Dietmar与操作者读取>>为每个单价值是好的,但你仍然有这个问题与endline。
但是,您不必存储在临时串整条生产线,你可以用的std :: istream的做流,更有效地::忽略():
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;
}
我不能完全确定你所要求的for.I假设你想读的文本文件,并保存一个字符串和两个整数(每行),并在新line.If打印每个这样试试这个:
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
int main()
{
string str;
int a,b;
ifstream file("test.txt");
if(file.is_open() == false)
{
cout << "Error: File can't be loaded" << endl;
exit(1);
}
while(1)
{
if(!file)
break;
file >> str;
file >> a;
file >> b;
cout << str << endl;
cout << a << endl;
cout << b << endl;
}
file.close(); // Close the file to prevent memory leaks
return 0;
}
HTTPS ://www.google.com/#q=read+characters+from+a+file+in+c%2B%2B – 2012-01-29 19:03:16
而'fscanf'不适合你? – 2012-01-29 19:04:05
怎么或为什么没有阅读整条线为你做这项工作?一旦你读完了这一行,你可以随心所欲地做任何事情,包括分离它。 – 2012-01-29 19:04:24