3

私は奇妙な問題を抱えています:

ファイルを buf に読み込み、ssh (Linux) で実行しようとしました。

私のファイルには以下が含まれています:

We 
I
a

だからこれは私のバフです:

ここに画像の説明を入力

ここで、新しいファイルを作成し、buf をこの新しいファイルに貼り付けます。

FILE*nem_file_name;
nem_file_name= fopen("email1.clear","wb"); //create the file if not exist.
fwrite (buf, sizeof(char), strlen(buf),nem_file_name); //write the new sensored mail to the file. 

この場合、email1.clear というファイルが作成されましたが、その内容は次のとおりです。 We Ia

それをクリップボードにコピーしてこのトピックに貼り付けると、次のように貼り付けられました。

We 
I
a

ファイルに「終了行」がないのはなぜですか? クリップボードにあるものと同じにしたい:/

更新 次の方法で手動でbufを作成しようとしました:

char buf[10];
buf[0] = 'W';
buf[1] = 'e';
buf[2] = 32;
buf[3] = 13;
buf[4] = 10;
buf[5] = 'I';
buf[6] = 13;
buf[7] = 10;
buf[8] = 'a';
buf[9] = 0;

(ファイルを buf に読み込まなかったことに注意してください。ただし、手動で行います)

その後:

FILE*nem_file_name;
nem_file_name= fopen("email1.clear","wb"); //create the file if not exist.
fwrite (buf, sizeof(char), strlen(buf),nem_file_name);

そして、ファイルemail1.clearは私が望むように作成されました:

We
I
a

理解できない!

4

3 に答える 3

1

デバッガーのスクリーンショットは実際に Linux 環境のものですか? それとも、windows-debugger で作成しましたか?

元のファイルをどのように読み取るかによって異なります。テキスト モード (rまたは呼び出しrtfopen) を使用している場合、Linux は読み取り中に CRLF (13,10) を単一の LF (10) 文字に変換します。これをバイナリモード(wbコードのように)で新しいファイルに書き込むと、単一のLFのままになります。

メモ帳は単一の LF 文字を改行として処理できませんが、Web ブラウザーは明らかに処理します。

UPDATE :行末
文字の処理は、オペレーティング システムによって異なります。テキストモードでファイルを開くと、違いは読み取り/書き込み中に処理され、システムのモードとの間で変換されます。バイナリ モードでは、バイトは変換せずにそのまま読み書きされます ( fopen ドキュメント)。

これは、プログラムを実行する場所と、出力を読み取るクライアント (Linux/Windows) によって異なります。コードを Linux で実行し、Linux からテキスト ファイルを読み取り、Linux で使用するテキスト ファイルを生成する場合は、テキスト モードを使用します (Windows にも同じことが当てはまります)。プラットフォームを混在させる必要がある場合は、自分で行末を変換する必要がある場合があります。

于 2013-01-15T13:44:38.793 に答える
1

テキストなのになぜバイナリファイル( "wb")に書き込むのですか? テキストファイルを操作するだけで、すべてがうまくいくはずです(bファイルを読み取るときとファイルを書き込むときは、ファイルオープンモードから削除してください)

于 2013-01-15T14:44:11.060 に答える
-1

strlen(buf) は、文字列の終わりを示すヌル文字なしで buf のサイズを返すと思います。次のようにファイルに書き込むことができます。

fwrite (buf, sizeof(char), strlen(buf), nem_file_name);
char eos = '\0';
fputc (eos, nem_file_name);

私の推測です。幸運を!

于 2013-01-15T13:07:08.557 に答える