Как читать отформатированные данные в C ++? - PullRequest
14 голосов
/ 24 августа 2010

Я отформатировал данные следующим образом:

Words          5
AnotherWord    4
SomeWord       6

Он находится в текстовом файле, и я использую ifstream для его чтения, но как мне отделить число от слова? Слово будет состоять только из алфавитов, и между словом и числом будут определенные пробелы или символы табуляции, не зная, сколько.

Ответы [ 4 ]

20 голосов
/ 24 августа 2010

Предполагая, что в слове не будет пробелов (тогда это фактически не будет 1 слово), вот пример того, как читать до конца файла:

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

while(file >> str >> i)
    std::cout << str << ' ' << i << std::endl;
4 голосов
/ 24 августа 2010

Оператор >> переопределен для std :: string и использует пробел в качестве разделителя

, поэтому

ifstream f("file.txt");

string str;
int i;
while ( !f.eof() )
{
  f >> str;
  f >> i;
  // do work
}
3 голосов
/ 19 октября 2010

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;
}
2 голосов
/ 24 августа 2010

На самом деле это очень просто, вы можете найти ссылку здесь
Если вы используете табуляцию в качестве разделителей, вы можете использовать getline вместо этого и установить аргумент delim равным '\т.Более длинный пример будет:

#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;
    }
}
...