ページ 11

ファイル入出力

Posted: 2011年6月16日(木) 22:07
by rubby
C言語初心者です。
ファイル入出力について、テキストファイルにfgetsで得た文字を
書き込むプログラムを書く際に日本語で入力するとプログラム実行時に文字化けしてしまいます。
テキストファイルには日本語を入力するべきではないのでしょうか?
また、文字化けしないようにするには文字コードを指定したりする方法が
あるのでしょうか?
調べ方が良く分からないのでこちらに書かせて頂きました。
どなたか分かりやすく教えて頂けませんでしょうか?;宜しくお願いします。

Re: ファイル入出力

Posted: 2011年6月16日(木) 23:21
by box
rubby さんが書きました: ファイル入出力について、テキストファイルにfgetsで得た文字を
書き込むプログラムを書く際に日本語で入力するとプログラム実行時に文字化けしてしまいます。
さしあたり、どんなソースコードを書いて
どんな入力を与えたときに文字化けするかを示してください。

Re: ファイル入出力

Posted: 2011年6月17日(金) 13:19
by rubby
ご返信ありがとうございます。
VMware上でgcc使ってプログラミングしてます。
以下のソースで、入力を「あいうえお」等英数字以外にした時
文字化けしてしまいました。

コード:

#include <stdio.h>
#include <stdlib.h>
#define NAME 3

int g_i, g_m;											// global変数のカウンタ(mは文字列をline2[][]格納時に使う)

int main(void)
{
	FILE *file;										// ファイルポインタ
	char line1[256];									// 元ファイルデータの読み込み用
	char line2[NAME][20];							// 	追記ファイルに出力する文字列(6つ)を取得する
	
	/* 元ファイル読み込み */
	file = fopen("test2.txt", "r");
	
	if(file == NULL)
	{
		printf("読込:ファイルオープン失敗\n");
		return 1;
	}
	 else
	{
	 	printf("読込:ファイルオープン\n");
	}	
	
														// 又は while(fgets(line1, 256, file) != NULL)		
	/* 元ファイル内容を標準出力 */						// ifの条件が偽になった時点でループ抜ける	
	while(1)												
	{
    	char* j;
    	j = fgets(line1, 256, file);
    	if(j == NULL)
    	{
    		break;
    	}
        printf("%s\n", line1);
	}
	printf("-------------------  ここまで元内容  -------------------------\n");
	fclose(file);
	printf("読込終了:ファイルクローズ\n");


	/* fgetsで追記データ取得(NAME分の文字列をline[m][0]に格納) */	
	for(g_m=0; g_m<NAME; g_m++)
	{
		printf("%d人分の名前を入力(%d人目)\n", NAME, g_m+1);
		fgets(&line2[g_m][0], 20, stdin);
	
		if(line2[g_m][0] == '\n')
		{
			puts("何か文字を入力");									// 文字列の先頭に改行が来る場合は、エラーを出してプログラム終了。
			exit(0);	
		}
		
		/* fgetsは改行まで受け取るが、文字には最後に必ずヌルが入ってるからそこまでチェックする */
		for(g_i=0; line2[g_m][g_i] != '\0' ; g_i++)	
		{														
			if(line2[g_m][g_i] == '\n')							// 文字列の中で改行を発見したら、ヌルをその場所に代入
			{
				line2[g_m][g_i] = '\0';
			}
			break;													// breakで直前のfor分ループに戻る
		}
	}

	/* ファイルオープン&エラー処理 */	
    file = fopen("test2.txt","w");
    if(file == NULL)
	{
		printf("追記:ファイルオープン失敗\n");
		return 1;
	}
	 else
	{
	 	printf("追記:ファイルオープン\n");
	}
	
	/* 取得文字列をファイルへ追加書き込み */
   for(g_i=0; g_i<NAME; g_i++)									// ファイルからの一行読み出し
    {
  		fputs(&line2[g_i][0], file);							// ファイルへの一行出力
    }    
    fclose(file);
    printf("追記終了!ファイルクローズ\n");

	/*  ファイルオープン&エラー処理 */
	file = fopen("test2.txt", "r");
	if(file == NULL)
	{
		printf("追記確認:ファイルオープン失敗\n");
		return 1;
	}
	 else
	{
	 	printf("追記確認:ファイルオープン\n");
	}
	
	/* 画面上に追記後のファイル内容を出力 */
	for(g_i=0; g_i<NAME; g_i++)									//ファイルからの一行読み出し
	{
    	puts(&line2[g_i][0]);									//標準出力で一行読み出し
    }
 			 										
	fclose(file);
	printf("追記確認終了:ファイルクローズ\n");
	
	return 0;	
}



Re: ファイル入出力

Posted: 2011年6月17日(金) 21:50
by box
私のところでは文字化けしないですね。

ところで、
1)元のファイルを上書きするようになっていますが、そういう仕様のプログラムですか?
2)読み込み用には256バイトの領域があるのに対し、書き込み用の領域は20バイトですね。この食い違いは想定内ですか?

Re: ファイル入出力

Posted: 2011年6月17日(金) 22:46
by bitter_fox
rubby さんが書きました: VMware上でgcc使ってプログラミングしてます。
以下のソースで、入力を「あいうえお」等英数字以外にした時
http://d.hatena.ne.jp/RepsolFireBlade/2 ... 1263694188
こんなのは参考になりますか?