freadとfwriteの使い方

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アスタリスク

freadとfwriteの使い方

#1

投稿記事 by アスタリスク » 13年前

バイナリファイルの取り扱いの演習をしているのですが、わからないミスが出てしまい行き詰まってしまいました。
かれこれ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の使い方

#2

投稿記事 by エクレ » 13年前

datacの末尾datac[3]にヌル文字を入れてみてください

アスタリスク

Re: freadとfwriteの使い方

#3

投稿記事 by アスタリスク » 13年前

>>エクレさん
エクレ さんが書きました: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の使い方

#4

投稿記事 by エクレ » 13年前

いえ、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の使い方

#5

投稿記事 by アスタリスク » 13年前

>>エクレさん
エクレ さんが書きました:いえ、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で読み込んだ文字列はソース上でヌル文字を挿入しなくてはいけないのですね。
原理は↑の解釈で合っているのか不安ですが無事解決しました
本当にどうもありがとうございます。助かりました。

閉鎖

“C言語何でも質問掲示板” へ戻る