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

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

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

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

解決済

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

yuto_jake
yuto_jake

総合スコア40

C

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

1回答

-2評価

0クリップ

266閲覧

投稿2022/05/15 07:11

編集2022/05/15 22:53

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

c

#include<stdio.h> #include<stdlib.h> #include<conio.h> #include<string.h> void addtask(); void viewtask(); void edittask(); void deletetask(); struct task { char time[8]; char name[50]; char status[100]; char category[100]; char note[2000]; } ; int main() { int ch; printf("\n\n\t---------------------------------\n"); printf("\t---------------------------------"); while(1) { printf("\n\n\t\tMain Menu:"); printf("\n\n\tAdd Task\t[1]"); printf("\n\tView Task\t[2]"); printf("\n\tEdit Task\t[3]"); printf("\n\tDelete Task\t[4]"); printf("\n\tExit\t\t[5]"); printf("\n\n\tEnter your choice:"); scanf("%d",&ch); switch(ch) { case 1: addtask(); break; case 2: viewtask(); break; case 3: edittask(); break; case 4: deletetask(); break; case 5: printf("\n\n\t\tThank you for using Task manager!!^^"); getch(); exit(0); default: printf("\nYou entered wrong choice..."); printf("\nPress any key to try again"); getch(); break; } system("cls"); } return 0; } void addtask( ) { system("cls"); FILE *fp ; char another = 'Y' ,time[10]; struct task e ; char filename[15]; int choice; printf("\n\n\t\t---------------------------------\n"); printf("\t\t* Welcome to Add Task Menu! *"); printf("\n\t\t---------------------------------\n\n"); printf("Enter Task due date:[yyyy-mm-dd]:"); fflush(stdin); gets(filename); fp = fopen (filename, "ab+" ) ; if ( fp == NULL ) { fp=fopen(filename,"wb+"); if(fp==NULL) { printf("\nSystem Error..."); printf("\nPress any key to exit"); getch(); return ; } } while ( another == 'Y'|| another=='y' ) { choice=0; fflush(stdin); printf ( "\n\tEnter Task due date again:[yyyy-mm-dd]:"); scanf("%s",time); rewind(fp); while(fread(&e,sizeof(e),1,fp)==1) { if(strcmp(e.time,time)==0) { printf("\n\tThe Task already exists.\n"); choice=1; } } if(choice==0) { strcpy(e.time,time); printf("\tEnter Task name:"); fflush(stdin); gets(e.name); fflush(stdin); printf("\tEnter status:"); gets(e.status); fflush(stdin); printf("\tEnter category:"); gets(e.category); fflush(stdin); printf("\tNote:"); gets(e.note); fwrite ( &e, sizeof ( e ), 1, fp ) ; printf("\nYour Task is just added!\n"); } printf ( "\n\tWant to add another Task?(Y/N) " ) ; fflush ( stdin ) ; another = getchar( ) ; } fclose ( fp ) ; printf("\n\n\tPress any key to exit..."); getch(); }

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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:02

epistemeさん、コメントありがとうございます。 初心者で申し訳ないのですが、”テキストファイルにバイナリを書き込こむ”とはどういうことでしょうか? ご教授いただければ幸いです。
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さん、ご連絡及びコードの訂正ありがとうございます。 了解致しました。コード、ご説明のほどありがとうございました。<(_ _)>💦

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

C

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