私は次のようにデータをフォーマットしました:
言葉5 AnotherWord 4 SomeWord 6
テキストファイルにあり、ifstreamを使用して読み取っていますが、数字と単語を区切るにはどうすればよいですか?単語はアルファベットのみで構成され、単語と数字の間に特定のスペースまたはタブがありますが、いくつあるかはわかりません。
私は次のようにデータをフォーマットしました:
言葉5 AnotherWord 4 SomeWord 6
テキストファイルにあり、ifstreamを使用して読み取っていますが、数字と単語を区切るにはどうすればよいですか?単語はアルファベットのみで構成され、単語と数字の間に特定のスペースまたはタブがありますが、いくつあるかはわかりません。
「単語」内に空白がない(実際には1単語ではない)と仮定して、ファイルの最後まで読み取る方法のサンプルを次に示します。
std::ifstream file("file.txt");
std::string str;
int i;
while(file >> str >> i)
std::cout << str << ' ' << i << std::endl;
>>演算子はstd::stringに対してオーバーライドされ、区切り文字として空白を使用します
それで
ifstream f("file.txt");
string str;
int i;
while ( !f.eof() )
{
f >> str;
f >> i;
// do work
}
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;
}
実際には非常に簡単です。ここで参照を見つけることができます。
区切り文字としてタブを使用している場合は、代わりに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;
}
}