15

私は次のようにデータをフォーマットしました:

言葉5
AnotherWord 4
SomeWord 6

テキストファイルにあり、ifstreamを使用して読み取っていますが、数字と単語を区切るにはどうすればよいですか?単語はアルファベットのみで構成され、単語と数字の間に特定のスペースまたはタブがありますが、いくつあるかはわかりません。

4

4 に答える 4

22

「単語」内に空白がない(実際には1単語ではない)と仮定して、ファイルの最後まで読み取る方法のサンプルを次に示します。

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

while(file >> str >> i)
    std::cout << str << ' ' << i << std::endl;
于 2010-08-24T11:31:45.013 に答える
3

>>演算子はstd::stringに対してオーバーライドされ、区切り文字として空白を使用します

それで

ifstream f("file.txt");

string str;
int i;
while ( !f.eof() )
{
  f >> str;
  f >> i;
  // do work
}
于 2010-08-24T11:35:18.363 に答える
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;
}
于 2010-10-19T10:37:41.517 に答える
2

実際には非常に簡単です。ここで参照を見つけることができます。
区切り文字としてタブを使用している場合は、代わりに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;
    }
}
于 2010-08-24T11:18:24.743 に答える