2

現在、ファイルの内容をchar配列に読み込もうとしています。

たとえば、char配列に次のテキストがあります。42バイト:

{
    type: "Backup",
    name: "BackupJob"
}

このファイルはWindowsで作成されており、Visual Studio c ++を使用しているため、OSの互換性の問題はありません。

ただし、次のコードを実行すると、forループの完了時に、インデックス:39が取得され、10の前に13が表示されません。

// Create the file stream and open the file for reading
ifstream fs;
fs.open("task.txt", ifstream::in);

int index = 0;
int ch = fs.get();
while (fs.good()) {
    cout << ch << endl;
    ch = fs.get();
    index++;
}

cout << "----------------------------";
cout << "Index: " << index << endl;
return;

ただし、ファイルの長さのchar配列を作成しようとすると、以下のようにファイルサイズを読み取ると、合計ファイルサイズに起因する3つの追加のCR文字lengthが42になり、配列の終わりが台無しになります。危険なバイトで。

// Create the file stream and open the file for reading
ifstream fs;
fs.seekg(0, std::ios::end);
length = fs.tellg();
fs.seekg(0, std::ios::beg);

// Create the buffer to read the file
char* buffer = new char[length];
fs.read(buffer, length);
buffer[length] = '\0';
// Close the stream
fs.close();

16進ビューアを使用して、ファイルにCRLF(13 10)バイトが実際に含まれていることを確認しました。

ファイルの終わりを取得することと、get()メソッドとread()メソッドが実際に返すものには違いがあるようです。

誰かがこれを手伝ってくれませんか?

乾杯、ジャスティン

4

1 に答える 1

4

ファイルをバイナリモードで開く必要があります。これにより、読み取りドロップCRが停止します。

fs.open("task.txt", ifstream::in|ifstream::binary);
于 2013-03-26T11:52:30.340 に答える