質問ご覧いただきありがとうございます。
私はLinuxのストリームについて書籍で学習中です。その書籍の中でfread()とfwrite()を使ってcatコマンドを自作するという課題がありました。
そこで、以下のようなコードを書き、実行してみたのですが、文字化けが生じてしまいます(ファイル名: cat_stdio.c)。
######コード
c
1#include <stdio.h> 2#include <stdlib.h> 3 4static void do_cat(FILE *f); 5 6int 7main(int argc, char *argv[]) 8{ 9 int i; 10 11 if (argc == 1) { 12 do_cat(stdin); 13 } 14 for (i = 1; i < argc; i++) { 15 FILE *f; 16 17 f = fopen(argv[i], "r"); 18 if(!f) { 19 perror(argv[i]); 20 exit(1); 21 } 22 do_cat(f); 23 fclose(f); 24 } 25 exit(0); 26} 27 28#define BUFFER_SIZE 2048 29 30static void 31do_cat(FILE *f) 32{ 33 unsigned char buf[BUFFER_SIZE]; 34 35 fread(buf, 1, BUFFER_SIZE, f); 36 fwrite(buf, 1, BUFFER_SIZE, stdout); 37 // fputs(buf, stdout); 38}
######実行結果
c
1$ ./stdio_cat stdio_cat.c 2#include <stdio.h> 3#include <stdlib.h> 4 5static void do_cat(FILE *f); 6 7int 8main(int argc, char *argv[]) 9{ 10 int i; 11 12 if (argc == 1) { 13 do_cat(stdin); 14 } 15 for (i = 1; i < argc; i++) { 16 FILE *f; 17 18 f = fopen(argv[i], "r"); 19 if(!f) { 20 perror(argv[i]); 21 exit(1); 22 } 23 do_cat(f); 24 fclose(f); 25 } 26 exit(0); 27} 28 29#define BUFFER_SIZE 2048 30 31static void 32do_cat(FILE *f) 33{ 34 unsigned char buf[BUFFER_SIZE]; 35 36 fread(buf, 1, BUFFER_SIZE, f); 37 fwrite(buf, 1, BUFFER_SIZE, stdout); 38 // fputs(buf, stdout); 39}ps 40 ���j~@�x 41 ����Ps�������������\��������n�S�*��o��v��H�<ƿ�]��5v�$w}f"��� 42 ��f�!��[Z8 k{*X�/��n->^�� �˚qkG���+���'}����Deو����$�G�O�>@4�k��ݞ(�4l�y��gň����&��#��M>O��ȵ�5�v���Xs� ��������{F��N��͊px 43 ��x 44 ��x 45 ��K�Ys�@x 46 ���qs�,�ps�`���`���X���`x 47 ���nps�`���px 48 �����2�����z 49 ���x 50 ���x 51 ��3�Ys��x 52 ��0�Ys��z 53 �
コメントにもあるように、一旦fwrite()をコメントアウトし、fputs()で動作確認をしましたが、こちらは期待通りcatコマンドと同じ動きをし、文字化けは生じませんでした。
このことから、恐らくfwrite()に原因がありそうだということは検討できましたが、なぜ文字化けになってしまうのかが不明です。ご教示いただけませんでしょうか。
文字化けかどうかはどのように確認していますか?
ファイルをエディタで実行し、実行したファイルと異なる箇所を文字化けとしています。(同名のファイルstdio_cat.cをコマンドライン引数として指定し、標準出力に出力しているためです。)
回答1件
あなたの回答
tips
プレビュー