0

各行が 50 個のスペースで構成される 50 行のテキスト ファイルを生成しようとしています。ただし、数行ごとに、9 または 10 バイトの余分なバイトがファイルに追加されます。

#include <iostream>
#include <fstream>
using namespace std;

void InitializeCanvas() {
    ofstream file("paint.txt");
    int b = 0;
    for (int i = 0; i < 50; i++) {
        for (int j = 0; j < 50; j++) {
            file << " ";
        }
        file << "\r\n";

        //these lines show where the pointer is and where it should be
        b += 52;
        int pointer = file.tellp();
        int difference = pointer - b;
        cout << pointer << " (" << (difference) << ")" << endl;
    }
    file.close();
}

int main() {
    InitializeCanvas();
    return 0;
}

9 行目で、9 バイトが追加されます。19 行目には、19 バイトの余分なバイトがあります。29、39、および 49 も同様です。これらの行を除いて、余分なバイトは追加されません。何が原因でしょうか?このコードは、CodeBlocks 13.12 を使用してコンパイルされました。

4

2 に答える 2

2

編集:質問には追加情報が含まれているため、この回答の説明は完全には適合しません-それでも解決策は機能するはずです。

余分なバイトは、行ごとに 2 つの混合改行 ( NL+ CRLF) から得られます。コンパイラで\n既に解釈されているため、行末を見てみましょう。\r\n

...  20     0D   0D   0A
... Space   NL   CR   LF

解決策は のコンストラクタにありofstreamます。テキストモードです。

explicit ofstream (const char* filename, ios_base::openmode mode = ios_base::out);

データをバイナリ形式で使用\nまたは書き込むか、endl.

ofstream file("paint.txt", std::ios_base::binary | std::ios_base::out);
于 2015-09-10T23:27:19.230 に答える
0

一部の (Windows) コンパイラは "\n" を "\r\n" に置き換えます。そのため、"\r\n" と記述すると、'\r' が 2 回表示されます。

あなたがする必要があるendlのは、"\r\n"

次の行を置き換えます。

file << "\r\n";

に:

file << endl;
于 2015-09-10T23:37:37.823 に答える