ファイルの入出力なんですけど、下のソースを実行して、作成したファイルの中身を読み出したら、文字化けがおこるんです。どうしたらなおるんでしょうか?
#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;
}
ちなみに、環境はVisual Studio2008使ってます。
どう化ける? アルファベットは? 漢字は?
追加した分だけ化ける?
読み取った時点では化けてる?
などなど、とにかく説明不足。
答えてもらえる質問をしましょう。
読み取った時点で
上書きまたは新しくデータを付け加えるを選択して、でーたを書き込んだ文字列をよみとると、
書き込んだ文字列の表示(fputsで指定した文字列を表示)
フフフフフフフフフフフフフフフフフフフ『ファイルのオープンに成功
とでるんです。
追加した文字とは別に出るんでこまってるんです。
自分でも結構悩んだんですが、なかなかうまくいかなくて。
#include <stdio.h> を追加し、
他はいじらずにコンパイル・実行しましたが
その不具合は再現できません。
文字化けならxがyに変わるとかだろ。
たとえば
フフフフフフフフフフフフフフフフフフフ
と書いて
フフフフフフフフフフフフフフフフフフフ
と表示されるなら正しいわけだし。
これ文字化けじゃないだろ。
もしデバッグ版ならリビルドしてみ。
文字化けとは別の話だけど
char str[256];
なのに
fgets(str, 700, file)
はまずいんじゃない。
最初がif(mode == 1)のとき
fputs(str, sakusei1);
何も設定してないstrをファイルに書き込んでるのまずくないか。
空の文字列を初期化していなかったり、文字列の末尾にNULL文字が入っていな
かったりすると「フフフフフフ」とでることが多かったような気がします。
私も以前はよくやりましたが、文字列を使うときに
初期化→文字列をいれる→文字の長さ(または変数のサイズ)の末尾にNULL文字
を入れる、と明示的にして解決しました。
これが一般的と言っていいのかは僕には分かりませんが・・・試してみては?
char filenameとchar strに""と空の文字列を入れてみましたが、やはり結果は同じでした。どうすれば、フフフフフがきえるんでしょうか?
>char filenameとchar strに""と空の文字列を入れてみましたが、やはり結果は同じでした。どうすれば、フフフフフがきえるんでしょうか?
あらかじめメモ帳でファイルを作ってそれを開いてもでる?
テキストファイル(.txt拡張子)で作ったファイルを開いたときは出ませんけど、上のソースのようにコマンドを選択してテキストファイルを作成したり、上書きしたり追加したりすると文字化けするんです。でも、やりたい処理はコマンドの入力でテキストファイルの新規作成や上書きや表示などをしたいのですが、これがうまくいきません。もう自分でやるだけではかなりきついです。
1が選択された時に、
puts("ファイルの作成に成功\n");
fputs(str, sakusei1);
とありますが、
このfputs()は必要ないのではないでしょうか?
ここで初期化されていないstr[]が書き込まれるので、
(debugビルドであれば)フフフフ・・と書き込まれると思います。
試してみましたけど、やっぱり駄目でした。本当にどうしたらいいのでしょう?
↓ちょこちょこいぢくりました。動いてるみたいです。
#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;
}
// さらにぢくる・・・
/*
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 ;
}
ツイート | ![]() |