如何在C ++中读取格式化数据?

时间:2010-08-24 11:01:06

标签: c++ string iostream ifstream string-parsing

我格式化了如下数据:

Words          5
AnotherWord    4
SomeWord       6

它在一个文本文件中,我使用ifstream来读取它,但是如何将数字和单词分开?这个单词只包含字母,单词和数字之间会有一些空格或标签,不确定有多少。

4 个答案:

答案 0 :(得分:19)

假设“单词”中没有任何空格(那么它实际上不是1个单词),这里有一个如何读取到文件末尾的示例:

std::ifstream file("file.txt");
std::string str;
int i;

while(file >> str >> i)
    std::cout << str << ' ' << i << std::endl;

答案 1 :(得分:4)

&gt;&gt;对std::string重写了运算符,并使用空格作为分隔符

所以

ifstream f("file.txt");

string str;
int i;
while ( !f.eof() )
{
  f >> str;
  f >> i;
  // do work
}

答案 2 :(得分:3)

sscanf对此有好处:

#include <cstdio>
#include <cstdlib>

int main ()
{
  char sentence []="Words          5";
  char str [100];
  int i;

  sscanf (sentence,"%s %*s %d",str,&i);
  printf ("%s -> %d\n",str,i);

  return EXIT_SUCCESS;
}

答案 3 :(得分:2)

实际上非常简单,您可以找到参考here
如果您使用制表符作为分隔符,则可以使用getline代替并将delim参数设置为'\ t'。 更长的例子是:

#include <vector>
#include <fstream>
#include <string>

struct Line {
    string text;
    int number;
};

int main(){
    std::ifstream is("myfile.txt");
    std::vector<Line> lines;
    while (is){
        Line line;
        std::getline(is, line.text, '\t');
        is >> line.number;
        if (is){
            lines.push_back(line);
        }
    }
    for (std::size_type i = 0 ; i < lines.size() ; ++i){
        std::cout << "Line " << i << " text:  \"" << lines[i].text 
                  << "\", number: " << lines[i].number << std::endl;
    }
}