ページ 11

freadとfwriteの使い方

Posted: 2012年8月04日(土) 00:53
by アスタリスク
バイナリファイルの取り扱いの演習をしているのですが、わからないミスが出てしまい行き詰まってしまいました。
かれこれ2時間ほど手直しをしています。しかし症状は改善したものの、理想的に動きません。
ソースコードの添削をしていただけませんでしょうか。

演習はfreadとfwriteの2つあり、つながっています。

[演習1]
モード"wb"でオープンしたテキストファイルfwrite.txtに、
①char型の文字列(数字のみ3文字)を1回入力
②int型の数字を3回入力
を標準入力から無制限で受け取り、ファイルに出力プログラムを作成せよ
終了条件は、1回目のint型の数字に100が入力されることとする

↓自分で作ったソースです。

コード:

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

int main(void)
{
	char chardata[4];
	int intdata[3];
	FILE *fp;

	fp = fopen("fwrite.txt","wb");

	printf("データ入力\n");
	printf("char型(数字のみ3文字)を1回入力\n");
	printf("int型を3回入力\n");
	printf("1回目のint型入力の際,100が入力された時処理終了\n");

	while(1)
	{
		scanf("%s %d %d %d",chardata,&intdata[0],&intdata[1],&intdata[2]);

		if(intdata[0] == 100)
		{
			break;
		}
		fwrite(chardata,sizeof(char),3,fp);
		fwrite(intdata,sizeof(int),3,fp);
	}
	fclose(fp);
	return 0;
}
[演習2]
演習1で作成したfwrite.txtをモード"rb"でオープンし、入力したデータを標準出力に出力させよ

コード:

#include<stdio.h>

int main(void)
{
	int datai[3];
	char datac[4];

	FILE *fp;

	fp = fopen("fwrite.txt","rb");

	while(fread(datac, sizeof(char), 3, fp), !feof(fp))
	{
		fread(datai, sizeof(int), 3, fp);		

		printf("%s\n",datac);
		printf("%d %d %d\n",datai[0],datai[1],datai[2]);
	}
	fclose(fp);
	return 0;
}
[演習1の入力]
=====入力=====
データ入力
char型(数字のみ3文字)を一回入力
int型を三回入力
1回目のint型入力の際,100が入力された時処理終了
001 10 20 30
002 23 43 65
003 43 43 43
004 54 54 54
005 100 100 100
続行するには何かキーを押してください . . .
==============

[2演習の出力]
=====出力=====
001フフフフフフフフフ

10 20 30
002フフフフフフフフフ
23 43 65
003フフフフフフフフフ+
43 43 43
004フフフフフフフフフ6
54 54 54
続行するには何かキーを押してください . . .
==============

理想の出力では
=====出力=====
001
10 20 30
002
23 43 65
003
43 43 43
004
54 54 54
続行するには何かキーを押してください . . .
==============
となって欲しいです。
よろしくお願いします。

Re: freadとfwriteの使い方

Posted: 2012年8月04日(土) 01:06
by エクレ
datacの末尾datac[3]にヌル文字を入れてみてください

Re: freadとfwriteの使い方

Posted: 2012年8月04日(土) 01:14
by アスタリスク
>>エクレさん
エクレ さんが書きました:datacの末尾datac[3]にヌル文字を入れてみてください

コード:

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

int main(void)
{
	int datai[3];
	char datac[4];

	FILE *fp;
	
	strcpy(&datac[3],'\0');	//追加した行

	fp = fopen("fwrite.txt","rb");

	while(fread(datac, sizeof(char), 3, fp), !feof(fp))
	{
		fread(datai, sizeof(int), 3, fp);		

		printf("%s\n",datac);
		printf("%d %d %d\n",datai[0],datai[1],datai[2]);
	}
	fclose(fp);
	return 0;
}
こうでしょうか?
実行してみたところ、最後まで処理されず強制終了されてしまいました。

Re: freadとfwriteの使い方

Posted: 2012年8月04日(土) 01:20
by エクレ
いえ、freadで読み込んだ後の話です。

コード:

#include<stdio.h>
 
int main(void)
{
    int datai[3];
    char datac[4];
 
    FILE *fp;
 
    fp = fopen("fwrite.txt","rb");
 
    while(fread(datac, sizeof(char), 3, fp), !feof(fp))
    {
        fread(datai, sizeof(int), 3, fp);
		datac[3]='\0';
 
        printf("%s\n",datac);
        printf("%d %d %d\n",datai[0],datai[1],datai[2]);
    }
    fclose(fp);
    return 0;
}

Re: freadとfwriteの使い方

Posted: 2012年8月04日(土) 01:40
by アスタリスク
>>エクレさん
エクレ さんが書きました:いえ、freadで読み込んだ後の話です。

コード:

#include<stdio.h>
 
int main(void)
{
    int datai[3];
    char datac[4];
 
    FILE *fp;
 
    fp = fopen("fwrite.txt","rb");
 
    while(fread(datac, sizeof(char), 3, fp), !feof(fp))
    {
        fread(datai, sizeof(int), 3, fp);
		datac[3]='\0';
 
        printf("%s\n",datac);
        printf("%d %d %d\n",datai[0],datai[1],datai[2]);
    }
    fclose(fp);
    return 0;
}
動きました!
freadで読み込んだ文字列はソース上でヌル文字を挿入しなくてはいけないのですね。
原理は↑の解釈で合っているのか不安ですが無事解決しました
本当にどうもありがとうございます。助かりました。