どうして私ははistreamとの奇妙な結果を取得しています::(のchar *、STREAMSIZE nを、文字DELIM)を取得しますか?

StackOverflow https://stackoverflow.com/questions/1943481

  •  20-09-2019
  •  | 
  •  

質問

私はと同様の形式のファイルに読んでいます:

TIME, x, y, z
00:00:00.000 , 1, 2 , 3
00:00:00.001 , 2 , 3 , 4

など、および次のようなコード:

std::ifstream& istream;
char buffer[15];
double seconds, hours, mins; // initialised properly in real code

// to read in first column
istream.get(buffer, 14, ',');

int scanned = std::sscanf(buffer, "%d:%d:%lf", &hours, &mins, &seconds);

これは、ほとんどの時間のための最初の列の罰金に読み込みます。しかし、時折sscanf関数は失敗し、私はCodeGearのデバッガを使用してバッファ内にあるかどうか確認するとき、私はそれが例えば\000:00:023で読んだことがわかります。何らかの理由でそれが前面に、ヌル文字、\0を収集しています。私は、テキストファイルで見ると、正しく読み込まれた他のすべての時刻値と同じ形式であるように思われます。なぜそれが時折ヌル文字を追加していますか?そして、仕事の周りがあるのでしょうか?

役に立ちましたか?

解決

あなたは空白行を読んだことがある、またはファイルの終わりを超えて読み込もうとしている。

最初の文字は、文字列の終わりを意味し\0、です。

それ以降の任意の文字はそのままメモリされます。

他のヒント

これを試してみて、見..

ifstream inpfile("sample.txt");
char buffer[15];
inpfile.ignore(80, '\n');
while (!inpfile.eof())
{

    inpfile.get(buffer, 14, ',');
    int hrs, mins;
    double secs;
    hrs = mins = secs = -1;
    sscanf_s(buffer, "%d:%d:%lf", &hrs, &mins, &secs);
    cout << "hrs:" << hrs << "\t"
        << "mins:" << mins << "\t"
        << "secs:" << secs 
        << endl;
    inpfile.ignore(80, '\n');
}

最も可能性が高いあなたはどこかにあなたの入力ファイルの末尾にカンマを持っています。または行の最後の番号の後に空白の14文字よりおそらくよります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top