3

シリアルデータを取り込んでファイルに保存するプログラムを作成しています。データの各行にはタイムスタンプが付けられます。このコードでは、タイムスタンプ付きのデータ行は s です。

string s = get_timestamp();
cout << "input string named s is: " << s << "\n";  
numChars = sizeof(s);
cout << "size is: " << numChars << "\n"; 
fwrite( &s, sizeof(char) , numChars , DATA_LOG);

print ステートメントの出力

00000.27m,379named s is: 20130822.1141,00000.26m,379
size is: 28

何らかの理由で「s という名前の入力文字列」が上書きされているように見えることがわかります。ただし、これは私の主な関心事ではありません (理由はわかりませんが)。

私の主な問題は、私の fwrite がガベージをファイルに保存することです。numChars と string が正しいことがわかります。「&s」の代わりに「static_cast(&s)」を試してみましたが、結果は同じでした。何か案は?

4

3 に答える 3

4

まず、改行がs含まれていると思われます。これにより、カーソルが行の先頭に移動し、さらに出力が既に印刷されたものを上書きします。印刷される実際の文字を確認するには、プログラムの出力をファイルにリダイレクトし、16 進エディタ/ビューア (例: ) を使用して結果を調べます。xxd

第二に、sizeof(s)の長さを決定する正しい方法ではありませんstd::strings.length()代わりに使用してください。numCharsこれが間違っている理由です。

最後に、文字列をファイルに書き込むには、次を使用します。

fwrite( s.data(), sizeof(char) , s.length() , DATA_LOG);
于 2013-08-22T18:59:11.647 に答える
1

ファイルへの書き込みは次のstd::string sようになります。

fwrite(s.c_str(), 1, s.size(), DATA_LOG); 

コンソールの出力を見ると、データに他の問題がある可能性がありますが、デバッガーなどで実際のデータを確認しないとわかりません。

于 2013-08-22T19:03:51.367 に答える
0

sizeof(s)strlen(s)またはである必要がありますwcslen(s)

または、 を使用している場合は、実際のオブジェクトへのポインターではなく、長さを提供し、 を提供std::basic_string<>します。.length().c_str()char string pointer&s

だから試してください

if(!s.empty()){
    fwrite(s.c_str(), sizeof(s.front()), s.length(), DATA_LOG);
}
于 2013-08-22T19:01:45.280 に答える