私のテキストファイルは次のようになります。
987 10.50 N 50
383 9.500 N 20
224 12.00 N 40
データの2列目だけを読み取りたい。どうすればこれを行うことができますか?
他のものを読まずに 2 番目の列だけを読むことはできません。
できることは、すべてのデータを読み取り、2 番目の列以外をすべて無視することです。たとえば、( を使用して) データ行を読み取り、そこから anと aをstd::getline
抽出しますが、 行の と残りの部分は無視します。int
double
int
すべてのデータを読み取り、不要なフィールド (つまり「列」) を破棄する必要があります。含むフォーマット文字列%*d
はそれを行っています。
Cでは、次のようなものになる可能性があります (f
がFILE*
ハンドルであると仮定)
while (!feof(f)) {
int n=0; double x=0.0; char c[4]; int p=0;
if (fscanf(f, " %*d %f %*[A-Z] %*d", &x) < 1)
break;
do_something(x);
}
PS。ジェリー・コフィンのコメントに感謝
C89/C90 にはstrtok
、ファイルを行ごとに読み取り、列を「スペース」区切り文字で区切ってから、n 番目のトークン (ファイル内のその行の n 番目の列を表す) にアクセスできる機能があります。
strtok
で宣言されています
http://cplusplus.com/reference/cstring/
一部の実装には、 と呼ばれるスレッドセーフな再入可能バージョンもありますstrtok_r
。
C++ではstd::istringstream
、 include: が必要な の使用を検討できます#include <sstream>
。何かのようなもの:
std::ifstream ifs("mydatafile.txt");
std::string line;
while(std::getline(ifs, line)) // read one line from ifs
{
std::istringstream iss(line); // access line as a stream
// we only need the first two columns
int column1;
float column2;
iss >> column1 >> column2; // no need to read further
// do what you will with column2
}
通常のファイルと同じように、入力ストリームstd::istringstream
のように扱うことができます。std::string
iss >> column1 >> column2
列データを vaiables に読み込むために使用できます。