-1

ファイルから特定の位置にある 4 文字を読み取ろうとしています。コードは単純ですが、結果は非常に紛らわしいものです。

fstream dicomFile;
dicomFile.open(argv[1]);
dicomFile.seekg(128,ios::beg);
char * memblock = new char [4];
dicomFile.read(memblock,4); 
cout<<"header is "<<memblock<<endl;

理想的には結果は「DICM」である必要がありますが、コンソールからの実際の結果は、図に示すように「DICM」に加えて奇妙な文字でした。さらに、実行するたびに文字が異なります。これは ASCII と Unicode に関するものかもしれません。プロジェクト プロパティを Unicode からマルチバイトに変更してから元に戻そうとしましたが、違いはありませんでした。

ここに画像の説明を入力

ここで何が起こっているのか、どうすれば解決できるのか知っている人はいますか? どうもありがとう!

4

2 に答える 2

3

C スタイルの ( ) 文字列は、 null ターミネータchar *の概念を使用します。これは、文字列が最後の要素の文字で終了することを意味します。文字列を終了するヌル文字を含まない 4 文字のバッファーに正確に 4 文字を読み込んでいます。C および C++ は、文字列の末尾を示す null ターミネータを検索するために、バッファの末尾からすぐに実行されます。'\0'

クイックフィックスは、 のブロックを作成し、データlength + 1を読み込んでlengthから、 を設定することstr[length] = '\0'です。あなたの場合は以下のようになります。

char * memBlock = new char [5];
// populate memBlock with 4 characters
memBlock[ 4 ] = '\0';

より良い解決策は、C++ で文字列を操作する場合std::stringの代わりにを使用することです。char *

于 2014-10-30T05:02:49.130 に答える
0

バッファをゼロで初期化して、すべての場所に null ターミネータを配置することもできます。

char * memblock = new char [5](); // zeros, and one element longer

かなり非効率ですが。

于 2014-10-30T05:17:38.870 に答える