質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.45%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

571閲覧

ファイルから読込んだ文字列が文字化け

yuto_jake

総合スコア42

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2022/05/15 07:11

編集2022/05/15 08:33

C言語で、タスク情報を記録できるシステムを作成しています。due dateおよびTask nameはtxtファイルで読み込み、)表示することができたのですが、その他の情報が書かれたtxtファイルを読込んで表示させようとすると文字化けしてしまいます。文字化けしないようにするにはどのようにしたらよいでしょうか?以下に、文字化けの結果、ソースコードをupしますので、ご教授よろしくお願いいたします。
イメージ説明

c

1#include<stdio.h> 2 3#include<stdlib.h> 4 5#include<conio.h> 6 7#include<string.h> 8 9 10void addtask(); 11 12void viewtask(); 13 14void edittask(); 15 16void deletetask(); 17 18struct task 19 20{ 21 22 char time[8]; 23 24 char name[50]; 25 26 char status[100]; 27 28 char category[100]; 29 30 char note[2000]; 31 32} ; 33 34int main() 35 36{ 37 38 int ch; 39 40 printf("\n\n\t---------------------------------\n"); 41 42 43 44 printf("\t---------------------------------"); 45 46 while(1) 47 48 { 49 50 printf("\n\n\t\tMain Menu:"); 51 52 printf("\n\n\tAdd Task\t[1]"); 53 54 printf("\n\tView Task\t[2]"); 55 56 printf("\n\tEdit Task\t[3]"); 57 58 printf("\n\tDelete Task\t[4]"); 59 60 printf("\n\tExit\t\t[5]"); 61 62 printf("\n\n\tEnter your choice:"); 63 64 scanf("%d",&ch); 65 66 switch(ch) 67 68 { 69 70 case 1: 71 72 addtask(); 73 74 break; 75 76 case 2: 77 78 viewtask(); 79 80 break; 81 82 case 3: 83 84 edittask(); 85 86 break; 87 88 case 4: 89 90 deletetask(); 91 92 break; 93 94 case 5: 95 96 printf("\n\n\t\tThank you for using Task manager!!^^"); 97 98 getch(); 99 100 exit(0); 101 102 default: 103 104 printf("\nYou entered wrong choice..."); 105 106 printf("\nPress any key to try again"); 107 108 getch(); 109 110 break; 111 112 } 113 114 system("cls"); 115 116 } 117 118 return 0; 119 120} 121 122void addtask( ) 123 124{ 125 126 system("cls"); 127 128 FILE *fp ; 129 130 char another = 'Y' ,time[10]; 131 132 struct task e ; 133 134 char filename[15]; 135 136 int choice; 137 138 printf("\n\n\t\t---------------------------------\n"); 139 140 printf("\t\t* Welcome to Add Task Menu! *"); 141 142 printf("\n\t\t---------------------------------\n\n"); 143 144 printf("Enter Task due date:[yyyy-mm-dd]:"); 145 146 fflush(stdin); 147 148 gets(filename); 149 150 fp = fopen (filename, "ab+" ) ; 151 152 if ( fp == NULL ) 153 154 { 155 156 fp=fopen(filename,"wb+"); 157 158 if(fp==NULL) 159 160 { 161 162 printf("\nSystem Error..."); 163 164 printf("\nPress any key to exit"); 165 166 getch(); 167 168 return ; 169 170 } 171 172 } 173 174 while ( another == 'Y'|| another=='y' ) 175 176 { 177 178 choice=0; 179 180 fflush(stdin); 181 182 printf ( "\n\tEnter Task due date again:[yyyy-mm-dd]:"); 183 184 scanf("%s",time); 185 186 rewind(fp); 187 188 while(fread(&e,sizeof(e),1,fp)==1) 189 190 { 191 192 if(strcmp(e.time,time)==0) 193 194 { 195 196 printf("\n\tThe Task already exists.\n"); 197 198 choice=1; 199 200 } 201 202 } 203 204 if(choice==0) 205 206 { 207 208 strcpy(e.time,time); 209 210 printf("\tEnter Task name:"); 211 212 fflush(stdin); 213 214 gets(e.name); 215 216 fflush(stdin); 217 218 printf("\tEnter status:"); 219 220 gets(e.status); 221 222 fflush(stdin); 223 224 printf("\tEnter category:"); 225 226 gets(e.category); 227 228 fflush(stdin); 229 230 printf("\tNote:"); 231 232 gets(e.note); 233 234 fwrite ( &e, sizeof ( e ), 1, fp ) ; 235 236 printf("\nYour Task is just added!\n"); 237 238 } 239 240 printf ( "\n\tWant to add another Task?(Y/N) " ) ; 241 242 fflush ( stdin ) ; 243 244 another = getchar( ) ; 245 246 } 247 248 fclose ( fp ) ; 249 250 printf("\n\n\tPress any key to exit..."); 251 252 getch(); 253 254}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tatsu99

2022/05/15 07:50

その文字化けするテキストの文字コードは何でしょうか。 OSは何でしょうか?
episteme

2022/05/15 07:51

> fwrite ( &e, sizeof (e), 1, fp ) ; テキストファイルにバイナリを書き込んでいませんか?
yuto_jake

2022/05/15 08:00

tatsu99さん、コメントありがとうございます。文字コードを判別したとこと、 Unicode (UTF-8) - utf-8 判定詳細 -候補1- 繁体字中国語 (hkscs) - Big5-HKSCS -候補2- 日本語 (シフト JIS) - shift_jis   又は下記の類似する文字エンコード   ・日本語 (シフト JIS) - CP932   ・日本語 (シフト JIS) - shift_jis2000   ・日本語 (シフト JIS) - shift_jis2004   ・日本語 (Mac) - x-mac-japanese -候補3- 繁体字中国語 (Eten) - x-Chinese-Eten   又は下記の類似する文字エンコード   ・繁体字中国語 (Mac) - x-mac-chinesetrad となりました。 またOSはWindows11になります。何卒宜しくお願い致します。
yuto_jake

2022/05/15 08:12

epistemeさん、失礼いたしました。 テキストファイルにはバイナリで書き込んでおりません。 何卒宜しくお願い致します。
tatsu99

2022/05/15 08:25

そのテキストファイルは、最初は空の状態から開始するのでしょうか? そして、このプログラムで、ファイルに書き込み、書き込んだ結果を読み込むのですか? そのテキストファイルを読み込んで表示している個所が見当たらないのですが、 どこでおこなっていますか? プログラムの一部だけですが、全部を提示していただけませんでしょうか。 ソースのアップ方法です。 以下のようにすると、きちんとソースが表示されます。 </>をクリックします。 ```ここに言語を入力 コード ``` と表示されるので ```① ② ``` ①の箇所にCと入力し ②の箇所にソースをコピペして貼り付けます。 そうすると、きちんと表示されます。
yuto_jake

2022/05/15 08:28

tatsu99さん、ご教授ありがとうございます。 おっしゃる通り、テキストファイルは空の状態から始まり、このプログラムからファイルに書き込み、結果が、以上のように文字化けしてしまいました。 また、ソースの書き方についてご教授ありがとうございます。tatsu99さんのアドバイスをもとにコード編集させていただきます。
tatsu99

2022/05/15 09:09

ソース拝見しました。 入力データに漢字を使用しない前提での回答です。(半角英数字、半角記号のみ使用) task内のtime,name,status,.... ですが、C言語の文字として扱うなら、終端NULLにする必要があります。 但し、そうすると、その文字をstruct毎まるまる書き込むとNULL文字が書き込まれます。 そうなると、メモ帳などのエディタで開いたとき、その個所が正しく表示されなくなります。 それを避けるためには、終端NULLではなく、残りに全てスペースを挿入する必要があります。 viewtask,edittask,deletetaskでどのように扱っているのかが不明ですが、 終端NULLではなく、残りに全てスペースを挿入する方法でaddtaskを書き直してみます。
tatsu99

2022/05/15 09:24

終端NULLではなく、残りに全てスペースを挿入する方法だと後々、無理が発生しそうなので、 残りに全てNULLを挿入するようにします。 そうすると、エディタで表示したとき、(完全ではありませんが)、それなりに読めるようになります。
yuto_jake

2022/05/15 09:32

Tatsuさん、コードの確認および、ご説明ありがとうございます。 NULLやstruct等、各コードについて十分な理解ができておりませんでした。 また、viewtask,edittask,deletetaskに関しましてもNULLを使ってコードを書いておりす。。現在投稿させていただいている、質問では文字数が足らなかったため、省略させて頂きました。 >終端NULLではなく、残りに全てスペースを挿入する方法でaddtaskを書き直してみます。 →ありがとうございます。残り全てにスペースを挿入する方法も存じ上げていなかったため、大変助かります。 何卒よろしくお願い致します。
tatsu99

2022/05/15 09:37

すみません。残りに全てスペースを挿入する方法は、いろいろ、影響がありそうなので、 残りに全てNULLを挿入する方法に変えました。その内容で回答しています。 この方が、あなたの目的に沿っているとおもいます。 本来の目的は、エディタで正しく表示することではなくて、プログラム上で正しく表示し、 追加、表示、削除などが正しく行われることのはずですから。
yuto_jake

2022/05/15 13:53

Tatsuさん、ご連絡及びコードの訂正ありがとうございます。 了解致しました。コード、ご説明のほどありがとうございました。<(_ _)>💦
guest

回答1

0

ベストアンサー

他にももんだいになりそうなところはありますが、
まず、
memset(&e,0x00,sizeof(e));
この1行を追加してください。
eの中にゴミがあるので、ゴミのまま書き込むと、意味不明な文字が表示されます。
まず、eのごみをきれいにNULLクリアしてから書き込むようにします。

C

1void addtask( ) 2{ 3 system("cls"); 4 FILE *fp ; 5 char another = 'Y' ,time[10]; 6 struct task e ; 7 char filename[15]; 8 int choice; 9 printf("\n\n\t\t---------------------------------\n"); 10 printf("\t\t* Welcome to Add Task Menu! *"); 11 printf("\n\t\t---------------------------------\n\n"); 12 printf("Enter Task due date:[yyyy-mm-dd]:"); 13 fflush(stdin); 14 gets(filename); 15 fp = fopen (filename, "ab+" ) ; 16 if ( fp == NULL ) 17 { 18 fp=fopen(filename,"wb+"); 19 if(fp==NULL) 20 { 21 printf("\nSystem Error..."); 22 printf("\nPress any key to exit"); 23 getch(); 24 return ; 25 } 26 } 27 while ( another == 'Y'|| another=='y' ) 28 { 29 choice=0; 30 fflush(stdin); 31 printf ( "\n\tEnter Task due date again:[yyyy-mm-dd]:"); 32 scanf("%s",time); 33 rewind(fp); 34 while(fread(&e,sizeof(e),1,fp)==1) 35 { 36 if(strcmp(e.time,time)==0) 37 { 38 printf("\n\tThe Task already exists.\n"); 39 choice=1; 40 } 41 } 42 if(choice==0) 43 { 44 memset(&e,0x00,sizeof(e)); //この行を追加 45 strcpy(e.time,time); 46 printf("\tEnter Task name:"); 47 fflush(stdin); 48 gets(e.name); 49 fflush(stdin); 50 printf("\tEnter status:"); 51 gets(e.status); 52 fflush(stdin); 53 printf("\tEnter category:"); 54 gets(e.category); 55 fflush(stdin); 56 printf("\tNote:"); 57 gets(e.note); 58 fwrite ( &e, sizeof ( e ), 1, fp ) ; 59 printf("\nYour Task is just added!\n"); 60 } 61 printf ( "\n\tWant to add another Task?(Y/N) " ) ; 62 fflush ( stdin ) ; 63 another = getchar( ) ; 64 } 65 fclose ( fp ) ; 66 printf("\n\n\tPress any key to exit..."); 67 getch(); 68} 69

投稿2022/05/15 09:30

tatsu99

総合スコア5474

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuto_jake

2022/05/15 09:37

Tatsu99さん、ご回答、ご説明本当にありがとうございます。どこを改善すれば良いか分からなかったので、とても助かりました。 tatsu99さんにご教授頂いたコードで1度実行させていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.45%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問