2012-01-29 59 views
0

我正在尝试从文件中读取数据,但是我唯一能够使用的方法是使用getline()。如何在C++中通过字符读取char?

问题是,读一整行不适合我的工作。事后

abc 10 20 
bbb 10  30 
ddd 40 20 

时每行的第一个词应该被保存为一个字符串,这两个数字为整数:

我输入文件看起来像这样。 每行中的“单词”之间的分隔符可以是空格或制表符。

那么唯一的解决方案是通过字符读取char?还是有另一种解决方案?

+0

HTTPS ://www.google.com/#q=read+characters+from+a+file+in+c%2B%2B – 2012-01-29 19:03:16

+0

而'fscanf'不适合你? – 2012-01-29 19:04:05

+3

怎么或为什么没有阅读整条线为你做这项工作?一旦你读完了这一行,你可以随心所欲地做任何事情,包括分离它。 – 2012-01-29 19:04:24

回答

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如上所述分割这一行。

+0

谢谢,终于有人推荐使用流而不是C函数... – 2012-01-29 19:09:14

+0

对于实现[IOStreams自己版本]的人来说,你并不感到惊讶(http://www.dietmar-kuehl.de/cxxrt/ )(是的,它已经过时了,但我正在积极研究更新)推荐使用IOStreams? ;-) – 2012-01-29 19:17:45

+0

我很惊讶没有其他人。 – 2012-01-29 19:18:52

1

您可以使用getline()并有一个函数返回从getline()收到的字符串中的每个连续字符。

-1

使用的fscanf,http://www.cplusplus.com/reference/clibrary/cstdio/fscanf/

fscanf(stream, "%s %d %d", &s, &a, &b); 
+2

虽然你不应该这样使用它。至少像这样使用它:'if(fscanf(stream,“%s%d%d”,&s,&a,&b)== 3){...}'。你**总是**想检查输入的结果。此外,请注意,此用法仍然容易出现缓冲区溢出:正在读取的字符串的大小允许为任意大小,但不太可能为任意的所有定义分配了足够的空间。 – 2012-01-29 19:19:30

1

对于它的价值,我同意@迪特马尔的答案 - 但我可能会走得更远一点。从外观上看,每行输入代表某种逻辑记录。我可能会创建一个类来表示记录类型,并为该类提供的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>()); 
0

想法从@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; 
} 
0

我不能完全确定你所要求的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; 
}