メモリの動的読み込み

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

メモリの動的読み込み

#1

投稿記事 by guronn » 18年前

1つ目のプログラム
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int main(void)
{
    FILE*fp;
    fp = fopen("random.dat","w");
    if(fp==NULL){
	return 1;
    }
    int count;
    int a=100;
    fprintf(fp,"%d\n",a);
    srand((unsigned int)time(NULL));
    for(count=0; count<a; count++){
	fprintf(fp,"%d\n",rand()%10+1);
    }
    fclose(fp);
    return 0;
}
2つ目
#include <stdio.h>

int main(int argc,char *argv[/url])
{
        FILE *fp;
	fp = fopen("random.dat", "r");
	int j,total,num;
	int count = 100;
	for (total = j = 0; j < count; j++) {
		fscanf(fp, "%d", &num);
		total += num;
	}
	printf("AVE=%d\n",  total / count);
	fclose(fp);
	return 0;
}
1つ目のプログラムで100個の1~10の乱数をrandom.datに出力させ、
2つ目のプログラムでそのファイルを読み込み、合計値と平均値を出力するプログラムなのですが、

2つ目のプログラムで、malloc関数を使ってメモリを動的に読み込むようにすること。
読み込むメモリはrandom.datの先頭の数字を読み込むこと(この場合は100)。
random.datはプログラム内から読み込むのではなく、コマンドラインから読み込むこと。

と、この3つをやらなくてはなりません。
自分でも頑張ってみたのですが、時間の余裕があまりなく、ここに書き込ませていただきました。
ご助力お願いします。

miyaza

Re:メモリの動的読み込み

#2

投稿記事 by miyaza » 18年前

例えばこんな感じでどうでしょう

一つ目のプログラム
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define KNUM 100				/*乱数の個数*/

int main(void){
	int num[KNUM],count,knum = KNUM;
	FILE *fp;
	fp=fopen("random.dat","wb");
	if(!fp) return -1;
	fwrite(&knum,sizeof(knum),1,fp);	/*乱数の数を先頭に書き込み*/
	srand((unsigned int)time(NULL));
	for(count=0;count<KNUM;count++) num[count]=rand()%11;
	fwrite(num,sizeof(num),1,fp);		/*乱数の書き込み*/
	fclose(fp);
	return 0;
}
二つ目のプログラム
#include <stdio.h>
#include <stdlib.h>

int main(int argc,char *argv[/url]){
	int knum,count,total;
	int *num;
	FILE *fp;

	fp=fopen(argv[1],"rb");
	if(!fp) return -1;
	fread(&knum,sizeof(knum),1,fp);			/*乱数の数を取得*/
	printf("データの数 : %d\n",knum);
	num=(int *)malloc(knum*sizeof(int));		/*動的メモリの確保*/
	fread(num,sizeof(knum*sizeof(int)),knum,fp);	/*乱数を取得*/
	for(count=total=0;count<knum;count++) total+=num[count];
	printf("合計 : %d\n",total);
	printf("平均 : %d\n",total/knum);
	fclose(fp);
	free(num);
	return 0;
}
たぶん動くと思いますけど、バイナリ形式でファイルを読み書きしているので参考なるか分かりませんけど、テキスト形式でなければいけないのですか?

miyaza

Re:メモリの動的読み込み

#3

投稿記事 by miyaza » 18年前

>たぶん動くと思いますけど、バイナリ形式でファイルを読み書きしているので参考なるか分かりませんけど、テキスト
ミスりました。

たぶん動くと思いますけど、バイナリ形式でファイルを読み書きしているので参考なるか分かりませんけど、
テキスト形式じゃないとだめですかね?

box

Re:メモリの動的読み込み

#4

投稿記事 by box » 18年前

ファイルの中身と実行結果とを比べやすくするという観点から、
テキストファイルへの読み書きをおすすめします。
バイナリファイルを使う必然性があまり感じられないです。

テキストファイルに書き込んでおけば、エディタで開いて
中身が一目瞭然という大きな利点があります。

miyaza

Re:メモリの動的読み込み

#5

投稿記事 by miyaza » 18年前

>ファイルの中身と実行結果とを比べやすくするという観点から、
テキストファイルへの読み書きをおすすめします。
バイナリファイルを使う必然性があまり感じられないです。

確かにそうですよね。
なんで、バイナリでつくったのか・・・・・

一応テキスト版も

書き込み
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define KNUM 100				/*乱数の個数*/

int main(void){
	int count;
	FILE *fp;
	fp=fopen("random2.dat","wt");
	if(!fp) return -1;
	fprintf(fp,"%d\n",KNUM);	/*乱数の数を先頭に書き込み*/
	srand((unsigned int)time(NULL));
	for(count=0;count<KNUM;count++) fprintf(fp,"%d\n",rand()%11);		/*乱数の書き込み*/
	fclose(fp);
	return 0;
}
読み取り
#include <stdio.h>
#include <stdlib.h>

int main(int argc,char *argv[/url]){
	int knum,count,total;
	int *num;
	FILE *fp;

	fp=fopen(argv[1],"r");
	if(!fp) return -1;
	fscanf(fp,"%d\n",&knum);			/*乱数の数を取得*/
	printf("データの数 : %d\n",knum);
	num=(int *)malloc(knum*sizeof(int));		/*動的メモリの確保*/
	if(!num) return -1;
	for(count=total=0;count<knum;count++){
		fscanf(fp,"%d\n",&num[count]);
		total+=num[count];
	}
	printf("合計 : %d\n",total);
	printf("平均 : %d\n",total/knum);
	fclose(fp);
	free(num);
	return 0;
}

guronn

Re:メモリの動的読み込み

#6

投稿記事 by guronn » 18年前

どうもありがとうございました。
とても参考になりました。

yoh2

Re:メモリの動的読み込み

#7

投稿記事 by yoh2 » 18年前

マルチポストっぽいです。
http://c-chat.net/modules/newbb/index.php
まあ、特に目新しい情報はないのですが、向こうで関わったので報告しておきます。

guronn

Re:メモリの動的読み込み

#8

投稿記事 by guronn » 18年前

すみません
いろいろな人の話を参考にしたかったので書き込んでしまいました。
これからは注意させていただきますので、お許し下さい。

組木紙織

Re:メモリの動的読み込み

#9

投稿記事 by 組木紙織 » 18年前

<失礼にならないマルチポストの方法>

マルチポストしていることを明記する。
他にマルチポストしたページ(サイト)のURLを明示する。(回答者が回答を書き込む前に、すでに同一内容の返答がないか等を確認できるようにするため。ただし質問掲示板の多くは類似する他の掲示板へのリンクを貼る事自体、ルール違反、マナー違反とされる場合がほとんどである)
問題が解決した場合はマルチポストした全てのページに問題解決の報告を行う。

<Wikipedia マルチポストより>


私は他の掲示板はほとんど見ないのでマルチポストは気になりませんが、
気にする方は凄く気にするので、気をつけたほうが良いと思います。

#同時にするからマルチポストになるのであって時間をずらしたらマルチポストになるのかな?
#と最近思っています。

たかぎ

Re:メモリの動的読み込み

#10

投稿記事 by たかぎ » 18年前

> いろいろな人の話を参考にしたかったので書き込んでしまいました。

それは無理です。

まず、ネット上の掲示板やメーリングリストで回答している人は限られています。マルチポストをしても、回答してくれる人はそう多くはならないのです。

次に、マルチポストの良し悪しはともかく、それを嫌う人がいる以上、限られた回答者が更に減ることになります。

さらに、マルチポストでは話の流れが分散するため、質問者の受け答えに一貫性がなくなることが多々あります。そんな状況にまともに付き合う人はそう多くありません。

> #同時にするからマルチポストになるのであって時間をずらしたらマルチポストになるのかな?

上記のことを考えれば、おのずと答えは出るはずです。

最後にアドバイスです。
本気で多くの人の意見を聞きたいのであれば、英語のサイトで全世界の人を相手にする方が得策です。

guronn

Re:メモリの動的読み込み

#11

投稿記事 by guronn » 18年前

>組木紙織さん
>たかぎさん

貴重なご意見ありがとうございます。
こういったところに書き込むことが今までなかったために、失礼をしてしまいました。
これからはご意見を参考に書き込みをさせていただきます。

閉鎖

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