n個の読み取り&ファイル内ソート

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

n個の読み取り&ファイル内ソート

#1

投稿記事 by B.B. » 13年前

①キーボードから学生番号と氏名の組をn個読み込み、ファイルに書き込む関数。ただし、nの値とファイル名は引数として取得。
②引数で取得したファイル名のファイルから同じく引数で取得した個数の学生番号と氏名のデータを構造体変数に格納し、学生番号順に表示する関数。

上記の2つの関数を使用してプログラムを作りたいのですがn個の読み込みとファイル内のソートが分かりません。

コード:

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

struct student{
  int id;
  char name[20];
};

/*データファイル作成関数*/
int mk_nfile()
{
  int i,i_temp;
  char c_temp[20];
  FILE *fp;
  if((fp=fopen("name.txt","w"))==NULL){
    printf("file open error.\n");
 exit(1);
  }
  for(i=0;i<5;i++){
    scanf("%d",&i_temp);
    scanf("%s",c_temp);
    fprintf(fp,"%d ",i_temp);
    fprintf(fp,"%s\n",c_temp);
  }
  fclose(fp);
  return (0);
}

/*読み込み・並び替え関数*/
int read_sort()
{
  struct student member[5],st_temp;
  struct student *ptr;
  int i,i_temp;
  int j,k;
  char c_temp[30];
  FILE *fp;
  if((fp=fopen("name.txt","r"))==NULL){
    printf("file open error\n");
    exit(1);
  }

/*構造体変数へ代入*/
  ptr=member;
  for(i=0;i<5;i++){
    fscanf(fp,"%d",&i_temp);
    (ptr+i)->id=i_temp;
    fscanf(fp,"%s",c_temp);
    strcpy((ptr+i)->name,c_temp);
  }
  fclose(fp);

/*並び替え処理*/


}

main()
{  
  mk_nfile();
  read_sort();
}
OSはMac OS Xです。

box
記事: 2002
登録日時: 13年前

Re: n個の読み取り&ファイル内ソート

#2

投稿記事 by box » 13年前

>n個の読み込みとファイル内のソートが分かりません。

そのほかにわからないところは本当にありませんか?例えば、

>nの値とファイル名は引数として取得。

という仕様に対して、

> if((fp=fopen("name.txt","w"))==NULL){

ファイル名が固定になっていますね。仕様に反していませんか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

B.B.

Re: n個の読み取り&ファイル内ソート

#3

投稿記事 by B.B. » 13年前

n個の読み取りが分からないので、とりあえず引数の個数とファイルは指定しました。

box
記事: 2002
登録日時: 13年前

Re: n個の読み取り&ファイル内ソート

#4

投稿記事 by box » 13年前

>n個の読み取りが分からないので、とりあえず引数の個数とファイルは指定しました。

なんかよくわからないですね。
n個の読み取りがわからない、という話と、ファイル名を引数で与えることができない、という話は
リンクしてないです。
n個の読み取りがわからなくても、ファイル名を引数で与えることはできますよ。
仕様を1個1個つぶしていきましょう。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

B.B.

Re: n個の読み取り&ファイル内ソート

#5

投稿記事 by B.B. » 13年前

コード:

/*データファイル作成関数*/
int mk_nfile(int data, char file_name[])
{
  int i,i_temp;
  char c_temp[20];
  FILE *fp;
  if((fp=fopen(file_name[1],"w"))==NULL){
    printf("file open error.\n");
    exit(1);
  }
こうでよかったでしょうか?

box
記事: 2002
登録日時: 13年前

Re: n個の読み取り&ファイル内ソート

#6

投稿記事 by box » 13年前

>こうでよかったでしょうか?

正しくないです。ていうか、実際にコンパイル~実行してみれば、どうなるか体感できるんですけどね。

> if((fp=fopen(file_name[1],"w"))==NULL){

file_name[1]
というのは、例えばfile_name[]に"name.txt”を与えたときの'a'に相当します。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

B.B.

Re: n個の読み取り&ファイル内ソート

#7

投稿記事 by B.B. » 13年前

その辺りも含めてご教示ください。

box
記事: 2002
登録日時: 13年前

Re: n個の読み取り&ファイル内ソート

#8

投稿記事 by box » 13年前

file_name[1]
と書いた理由を教えてください。
file_name[0]
とか
file_name
とかではなく、
なぜ
file_name[1]
なのですか?

「何となくそう書いた」というのは、プログラミングで通用しません。それは、「書いた本人もわかっていない」ということだからです。
何となく書いたソースコードがちゃんと動くはずがないですよね。

あぁ、もちろん、「わかっているつもりで」書いたコードがちゃんと動かないことはありますよ。
それをつぶしていくのがテストとかデバッグとかいう工程です。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

B.B.

Re: n個の読み取り&ファイル内ソート

#9

投稿記事 by B.B. » 13年前

コマンドライン引数と勘違いしました。
file_name[0]が./a.outなので、file_name[1]かと。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: n個の読み取り&ファイル内ソート

#10

投稿記事 by みけCAT » 13年前

B.B. さんが書きました:ファイル内のソートが分かりません。
qsort関数を使うのが簡単だと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

box
記事: 2002
登録日時: 13年前

Re: n個の読み取り&ファイル内ソート

#11

投稿記事 by box » 13年前

B.B. さんが書きました:コマンドライン引数と勘違いしました。
file_name[0]が./a.outなので、file_name[1]かと。
それで、今はどのように理解されているのですか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

box
記事: 2002
登録日時: 13年前

Re: n個の読み取り&ファイル内ソート

#12

投稿記事 by box » 13年前

みけCAT さんが書きました:
B.B. さんが書きました:ファイル内のソートが分かりません。
qsort関数を使うのが簡単だと思います。
自作のバブルソート用関数を使うとか、他のソート方法ではダメですか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

B.B.

Re: n個の読み取り&ファイル内ソート

#13

投稿記事 by B.B. » 13年前

int mk_nfile(int data, char n_file[])
{
...................

main()
{
mk_file(10,'ファイル名');
read_sort();
}
ですか?

ソートはqsortを知らないのでバブルソートでやりたいと思っています。

box
記事: 2002
登録日時: 13年前

Re: n個の読み取り&ファイル内ソート

#14

投稿記事 by box » 13年前

>①キーボードから学生番号と氏名の組をn個読み込み、ファイルに書き込む関数。ただし、nの値とファイル名は引数として取得。

この仕様に従った関数を用意するのはいいとして、そもそも、
データの個数やファイル名は固定なのですか?

つまり、最後に提示された(断片的な)ソースでは、データの個数を10個で固定してあったり
ファイル名(書き方は違ってますけどね)も固定してあったりしますが、
そこを可変にする(何個のデータであっても、どんなファイル名であっても
コンパイルし直すことなしに対応できるようにする)ことは求められていないのですか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

閉鎖

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