文字化けを治すには?


ace  2008-06-13 04:44:21  No: 68540

ファイルの入出力なんですけど、下のソースを実行して、作成したファイルの中身を読み出したら、文字化けがおこるんです。どうしたらなおるんでしょうか?

#include "stdafx.h"
#include <stdlib.h>
#include<string.h>

//#include <fstream>
//#include <iostream>
//#include <istream>

int _tmain(int argc, _TCHAR* argv[])
{
        //変数の宣言
        int mode = 0;
        char str[256];
        FILE *file;
        FILE *save;
        FILE *sakusei1;
        //FILE *fp;

        char filename[256];

        //モードの選択([5]を選択したときだけプログラム終了)
        while(mode != 5){
                printf("次の[1]〜[5]を選択してください。\n");
                printf("[1]:新しくファイルを作る\n");
                printf("[2]:すでにあるファイルに上書きする\n");
                printf("[3]:すでにあるファイルに新しくデータを付け加える\n");
                printf("[4]:すでにあるファイルからデータを読み出す\n");
                printf("[5]:プログラムを終了する\n");
                scanf_s("%d", &mode);
                fflush(stdin);

                if(mode < 1 || mode > 5){   //エラーの場合
                        printf("エラーです。もう一度選択してください。\n");
                }else if(mode == 1){
                        //新規でファイルを作る
                        printf("ファイル名を入力\n");
                        gets(filename);
                        sakusei1 = fopen(strcat(filename, ".txt"), "a");
                        fputs("Udit17\n", sakusei1);

                        if(sakusei1 == NULL){  //失敗していないか
                                puts("ファイルの作成に失敗\n");
                                return 1;  //異常終了は0以外を返す
                        }

                        puts("ファイルの作成に成功\n");
                        fputs(str, sakusei1);
                        
                        fclose(sakusei1);
                        
                }else if(mode == 2){
                        //ファイルに上書き
                        printf("ファイル名を入力\n");
                        gets(filename);
                        save = fopen(strcat(filename, ".txt"), "r+");
                        
                        if(save == NULL){
                                puts("ファイルがオープンできません\n");
                                return 1;
                        }
                        
                        fputs("Houe Shinichi\n", save);
                        puts("ファイルを上書きしました\n");
                        
                        //while(fgets(str, 256, save) != NULL){
                        //      printf("%s\n" ,str);
                        //}
                        
                        fclose(save);
                        
                }else if(mode == 3){
                        //新しくデータを付け加える
                        printf("ファイル名を入力\n");
                        gets(filename);
                        save = fopen(strcat(filename, ".txt"), "a+");
                        
                        if(save == NULL){
                                puts("データの付け加えに失敗\n");
                                return 1;
                        }
                        
                        fputs("Knight HOUE\n", save);
                        
                        //while(fgets(str, 256, save) != NULL){
                                //printf("%s\n", str);
                        //}
                        
                        puts("ファイルにデータを付け加えました。\n");
                        
                        
                        fclose(save);
                        
                }else if(mode == 4){
                        //ファイルを開く
                        printf("ファイル名を入力\n");
                        gets(filename);
                        file = fopen(strcat(filename, ".txt"), "r");
                        
                        if(file == NULL){
                                puts("ファイルをオープンできません\n");
                                return 1;
                        }

                        while(fgets(str, 700, file) != NULL){
                                printf("%s", str);
                        }
                        
                        puts("ファイルのオープンに成功\n");

                        fclose( file );
                        
                }else{
                        //プログラムを終了する
                        printf("ファイル名を入力\n");
                        gets(filename);
                        
                        if(filename == NULL){
                                puts("ファイルのクローズに失敗\n");
                                return 1;
                        }
                        
                        file = fopen(filename, "r");
                        
                        puts("ファイルのクローズに成功\n");
                        fclose( file );
                }
        }

        return 0;
}


ace  2008-06-13 04:45:39  No: 68541

ちなみに、環境はVisual Studio2008使ってます。


επιστημη  URL  2008-06-13 06:52:14  No: 68542

どう化ける? アルファベットは? 漢字は? 
追加した分だけ化ける?
読み取った時点では化けてる?

などなど、とにかく説明不足。
答えてもらえる質問をしましょう。


ace  2008-06-13 07:11:12  No: 68543

読み取った時点で
上書きまたは新しくデータを付け加えるを選択して、でーたを書き込んだ文字列をよみとると、

書き込んだ文字列の表示(fputsで指定した文字列を表示)
フフフフフフフフフフフフフフフフフフフ『ファイルのオープンに成功
とでるんです。


ace  2008-06-13 07:12:44  No: 68544

追加した文字とは別に出るんでこまってるんです。
自分でも結構悩んだんですが、なかなかうまくいかなくて。


επιστημη  URL  2008-06-13 15:17:54  No: 68545

#include <stdio.h> を追加し、
他はいじらずにコンパイル・実行しましたが
その不具合は再現できません。


wclrp ( 'o')  2008-06-13 16:43:51  No: 68546

文字化けならxがyに変わるとかだろ。

たとえば
フフフフフフフフフフフフフフフフフフフ
と書いて
フフフフフフフフフフフフフフフフフフフ
と表示されるなら正しいわけだし。

これ文字化けじゃないだろ。

もしデバッグ版ならリビルドしてみ。

文字化けとは別の話だけど
char str[256];
なのに
fgets(str, 700, file)
はまずいんじゃない。

最初がif(mode == 1)のとき
fputs(str, sakusei1);
何も設定してないstrをファイルに書き込んでるのまずくないか。


どら  2008-06-13 18:54:47  No: 68547

空の文字列を初期化していなかったり、文字列の末尾にNULL文字が入っていな
かったりすると「フフフフフフ」とでることが多かったような気がします。

私も以前はよくやりましたが、文字列を使うときに
初期化→文字列をいれる→文字の長さ(または変数のサイズ)の末尾にNULL文字
を入れる、と明示的にして解決しました。

これが一般的と言っていいのかは僕には分かりませんが・・・試してみては?


ace  2008-06-14 05:04:24  No: 68548

char filenameとchar strに""と空の文字列を入れてみましたが、やはり結果は同じでした。どうすれば、フフフフフがきえるんでしょうか?


そだ  2008-06-14 08:27:07  No: 68549

>char filenameとchar strに""と空の文字列を入れてみましたが、やはり結果は同じでした。どうすれば、フフフフフがきえるんでしょうか?

あらかじめメモ帳でファイルを作ってそれを開いてもでる?


ace  2008-06-15 03:54:24  No: 68550

テキストファイル(.txt拡張子)で作ったファイルを開いたときは出ませんけど、上のソースのようにコマンドを選択してテキストファイルを作成したり、上書きしたり追加したりすると文字化けするんです。でも、やりたい処理はコマンドの入力でテキストファイルの新規作成や上書きや表示などをしたいのですが、これがうまくいきません。もう自分でやるだけではかなりきついです。


CMSK  2008-06-15 07:25:01  No: 68551

1が選択された時に、
  puts("ファイルの作成に成功\n");
  fputs(str, sakusei1);
とありますが、
このfputs()は必要ないのではないでしょうか?
ここで初期化されていないstr[]が書き込まれるので、
(debugビルドであれば)フフフフ・・と書き込まれると思います。


ace  2008-06-15 07:45:32  No: 68552

試してみましたけど、やっぱり駄目でした。本当にどうしたらいいのでしょう?


επιστημη  URL  2008-06-15 11:18:14  No: 68553

↓ちょこちょこいぢくりました。動いてるみたいです。

#include "stdafx.h"
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

int main() {

  //変数の宣言
  int mode = 0;
  char filename[256];

  //モードの選択([5]を選択したときだけプログラム終了)
  while(mode != 5){
    printf("次の[1]〜[5]を選択してください。\n");
    printf("[1]:新しくファイルを作る\n");
    printf("[2]:すでにあるファイルに上書きする\n");
    printf("[3]:すでにあるファイルに新しくデータを付け加える\n");
    printf("[4]:すでにあるファイルからデータを読み出す\n");
    printf("[5]:プログラムを終了する\n");
    scanf_s("%d", &mode);
    fflush(stdin);

    if(mode < 1 || mode > 5){ //エラーの場合
      printf("エラーです。もう一度選択してください。\n");
    }
    //新規でファイルを作る
    else if (mode == 1) {
      FILE* fp;
      printf("ファイル名を入力\n");
      gets(filename);
      fp = fopen(strcat(filename, ".txt"), "w");
      if(fp == NULL){  //失敗していないか
        puts("ファイルの作成に失敗\n");
        return 1;  //異常終了は0以外を返す
      }
      fputs("mode-1:新規作成によって書きこまれた文字列\n", fp);
      fclose(fp);
      puts("ファイルの作成に成功\n");
    }
    //ファイルに上書き
    else if(mode == 2) {
      FILE* fp;
      printf("ファイル名を入力\n");
      gets(filename);
      fp = fopen(strcat(filename, ".txt"), "r+");
      if ( fp == NULL) {
        puts("ファイルがオープンできません\n");
        return 1;
      }
      fputs("mode-2:上書きによって書きこまれた文字列\n", fp);
      fclose(fp);
      puts("ファイルを上書きしました\n");
    }
    //新しくデータを付け加える
    else if (mode == 3) {
      FILE* fp;
      printf("ファイル名を入力\n");
      gets(filename);
      fp = fopen(strcat(filename, ".txt"), "a+");
      if (fp == NULL) {
        puts("データの付け加えに失敗\n");
        return 1;
      }
      fputs("mode-3:追加によって書きこまれた文字列\n", fp);
      fclose(fp);
      puts("ファイルにデータを付け加えました。\n");
    } 
    //ファイルを開く
    else if (mode == 4) {
      char str[256];
      FILE* fp;
      printf("ファイル名を入力\n");
      gets(filename);
      fp = fopen(strcat(filename, ".txt"), "r");
      if (fp == NULL) {
        puts("ファイルをオープンできません\n");
        return 1;
      }
      puts("-----------------");
      while(fgets(str, 700, fp) != NULL){
        printf("%s", str);
      }
      puts("-----------------");
      fclose( fp );
      puts("ファイルのオープンに成功\n");
    }
    //プログラムを終了する
    else {
      break;
    }
  }
  return 0;
}


  2008-07-04 05:56:32  No: 68554

// さらにぢくる・・・
/*
    FileIO.cpp
    XP sp3 , VC2005 ,
    /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" 
    /Gm /EHsc /RTC1 /MDd /Fo"Debug\\" /Fd"Debug\vc80.pdb" /W4 /nologo 
    /c /Wp64 /ZI /TP /errorReport:prompt
*/

#include <stdio.h>
#include <string.h>

int main() 
{

    // 変数の宣言
    static int  mode = 0 ;
    char        filename[ 256 ] ;
    char        str[ 1024 ] ;
    FILE *      fp ;
    errno_t     err ;
   

    // モードの選択([5]を選択したときだけプログラム終了)
    while( mode != 5 )
    {
        printf( "次の[1]〜[5]を選択してください。\n" ) ;
        printf( "[1]:新しくファイルを作る\n" ) ;
        printf( "[2]:すでにあるファイルに上書きする\n" ) ;
        printf( "[3]:すでにあるファイルに新しくデータを付け加える\n" ) ;
        printf( "[4]:すでにあるファイルからデータを読み出す\n" ) ;
        printf( "[5]:プログラムを終了する\n" ) ;

       
        scanf_s( "%d", &mode ) ;
        fflush( stdin ) ;

        if( ( 0 < mode ) && ( mode < 5 ) ) 
        {
            printf( "ファイル名を入力\n" ) ;
            gets_s( filename ) ;
            strcat_s( filename, ".txt" ) ;
        }
        
        
        switch( mode )
        {
            case 1:     // 新規でファイルを作る
                
                err = fopen_s( &fp, filename, "w" ) ;
                if( err )
                {  
                    puts( "ファイルの作成に失敗\n" ) ;
                    return 1 ;  
                }
                else
                {
                    puts( "ファイルの作成に成功\n" ) ;
                    fputs( "mode-1:新規作成によって書きこまれた文字列\n", fp ) ;
                    fclose( fp ) ;
                }
                break ;

        
            case 2:     // ファイルに上書き
            
                err = fopen_s( &fp, filename, "r+" ) ;
                if( err )
                {
                    puts( "ファイルがオープンできません\n" ) ;
                    return 1 ;
                }
                else
                {
                    fputs( "mode-2:上書きによって書きこまれた文字列\n", fp ) ;
                    puts( "ファイルを上書きしました\n" ) ;
                    fclose( fp ) ;
                }
                break ;

        
            case 3:     // 新しくデータを付け加える
      
                err = fopen_s( &fp, filename, "a+" ) ;
                if ( err ) 
                {
                    puts( "データの付け加えに失敗\n" ) ;
                    return 1;
                }
                else
                {
                    fputs( "mode-3:追加によって書きこまれた文字列\n", fp ) ;
                    puts( "ファイルにデータを付け加えました。\n" ) ;
                    fclose( fp ) ;
                }
                break ;

         
            case 4:     // ファイルを開く
             
                err = fopen_s( &fp, filename, "r" ) ;
                if ( err ) 
                {
                    puts("ファイルをオープンできません\n") ;
                    return 1 ;
                }
                else
                {
                    puts("ファイルのオープンに成功\n") ;
                    puts( "-----------------" ) ;
                    while( fgets( str, 700, fp ) )
                    {
                        printf( "%s", str ) ;
                    }
                    puts( "-----------------" ) ;
                    fclose( fp ) ;
                }
                break ;

        
            case 5:     // プログラムを終了する
                return 0 ;

        
            default :
                printf( "エラーです。もう一度選択してください。\n" ) ;
                break ;
        }
    } 
    
    return 0 ;
}


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加