• 締切済み

ファイルの入出力

今までに大統領になった人の就任日、代、名前などデータがCSVファイルとしてあります。そのファイルをfgets関数で1行ずつ読み込み、大統領になった回数が多い順に並び替えて新しいcsvファイルに出力したいと考えています。 構造体にそのデータを入れていきたいと思うのですが、その構造体にデータを入れるにはどのようにしたら良いのでしょうか??またどのような構造体を作れば良いのでしょうか??win98でc言語を使用しています。

みんなの回答

回答No.3

CSVファイルの内容(特に項目)が明確になっていないので質問にあるデータのみとなることをご了承下さい。 構造体の作り方について回答させて頂きます。 ずばり、以下のようにすると良いと思います。 変数名・型・サイズは例ですので、必要に応じて変更して下さるようにお願いします。 /* 構造体のタグを定義する */ struct PRESIDENT { char inauguration-date[9]; /* 就任日:yyyymmdd */ int generation; /* 代 */ char name[101]; /* 名前 */ int times; /* 回数 */ } ; struct PRESIDENT president[100]; /* 実体を確保 */ 構造体にデータを入れる方法について、以下に回答します。 尚、以下の説明で使用している変数はあらかじめ定義してあり、かつ適切なサイズである。また、入力ファイルは必ず存在するものとします。 /* 入力側のcsvファイルを開く */ fp = fopen("input-president.csv", r); /* カンマ(,)を探して、データを構造体に格納する */ memset(Buffer, '\0', sizeof(Buffer)); /* fgetsでファイル中のレコードを読み込む */ for (j = 0; j < 100 && fgets(Buffer, sizeof(Buffer)-1, fp) != NULL; j++) { char *stptr = &Buffer[0]; for (i = 0; i < sizeof(Buffer)-1; i++) { /* 就任日を探して、構造体に格納 */ if(Buffer[i] == ',') { Buffer[i] = '\0'; strcpy(president[j].inauguration-date, stptr); i++; break; } } stptr = &Buffer[i]; for ( ; i < sizeof(Buffer)-1; i++) { /* 代を探して、構造体に格納 */ if(Buffer[i] == ',') { Buffer[i] = '\0'; president[j].generation = atoi(stptr); i++; break; } } stptr = &Buffer[i]; for ( ; i < sizeof(Buffer)-1; i++) { /* 名前を探して、構造体に格納 */ if(Buffer[i] == ',') { Buffer[i] = '\0'; strcpy(president[j].name, stptr); i++; break; } } stptr = &Buffer[i]; /* 回数は最後の項目なので探す必要はない */ president[j].times = atoi(stptr); memset(Buffer, '\0', sizeof(Buffer)); } 以上で、ファイルからの入力は終了しました。 /* 入力ファイルをクローズする */ fclose(fp); fp = NULL; 以降の処理は、   構造体のデータをソートする   ソートが終わったデータをファイルに出力する ですが、ご質問ではデータの入力までなので 割愛させて頂きます。 以上の回答を参考にして頂ければ幸いです。

回答No.2

fgets関数で取得したデータを各データに分ける。 分けたデータを構造体のメンバーに保存。 それをファイル全体に施しす。 構造体のデータをソート。 全構造体をファイルに書き出す。

  • jppy
  • ベストアンサー率14% (14/99)
回答No.1

とりあえず 「猫でも分かるプログラミング」の15章を読んだ方がいいと思います。 検索エンジンで調べればでてきます。

関連するQ&A

  • ファイルの入出力

    氏名・身長・体重が入っているファイルからデータを構造体として読み取りその人の肥満度を表示するプログラムを作りたいのですが一考にわかりません。。。誰か知恵を貸してくれませんか 肥満度は20未満が「やせすぎ」20以上25未満は「普通」25以上は「肥満」としています。ファイルには27にんのデータが入っています。肥満度の計算は関数を作成で、関数名はbmiで引数は構造体、戻り値は実数です。肥満度の計算は体重÷身長÷身長です。 構造体は自分で定義します。よろしくお願いします

  • csvファイルでの出力について

    C言語初心者です。 プログラミングにおいて質問なのですが、csvファイルを読み込み、 そのデータを用いて計算し、csvファイルで出力するという問題なのですが、C言語においてcsvファイル形式で出力するにはどのような方法がありますか? 補足:ラベル行に全角文字を入力しないといけません。

  • ファイル入出力に関して

    一度ファイルに保存した、int型データを再び取り出してint型配列に入れ足し算などをしたいのですが、ファイル入出力にはどんな関数を使えばよろしいでしょうか? 教えてください。 出力したデータは、ノートパッドなどで見れなくていいです。

  • ファイルからのデータ読み込み方法について

    はじめまして、数ヶ月前からC言語を始めたものです。 ファイルからのデータ読み込みについて質問です。 テキストファイルとして以下のようなものがあります。 ************************* 23 3346 45 423 34 23 345 45 56 6345 ・・・ ・・・ ************************* このようなファイルから読み込みを行って、スペース毎の数字(整数型)を構造体の中の変数に順次格納していくようなプログラムを作りたいとおもうのですがどのように行ったらいいのでしょうか? 現在、fgets()で行ごとの文字列を読み込んでから、型変換を行おうと心みているのですが、うまくいきません。 回答よろしくお願いします。

  • ファイルの入出力2

    指定したフォルダ内にあるcsvファイルのデータを 指定したhtmlファイルに出力するプログラムを書いているのですが、 下記のままだとcsvファイルにあるすべてのデータをとってきてしまいます。実現させたいことは「指定したフォルダ内にあるcsvファイル2行目のデータだけファイル出力する」というものです。 どなたかご協力お願いします。 #!/usr/bin/perl #--------------------------------------------------------------# # ディレクトリを開く #--------------------------------------------------------------# opendir(DIR,"test/"); #--------------------------------------------------------------# # 出力ファイル名を指定 #--------------------------------------------------------------# $dest = "test.html"; open (OUT, ">$dest") or die "$!"; #--------------------------------------------------------------# # 出力ファイルにhtmlを出力 #--------------------------------------------------------------# print OUT '<html> <head> <title>無題ドキュメント</title> <style type="text/css"> <!--.style1 {color: #FFFFFF}--> </style> </head> <body> <table width="419" height="105" border="0" cellpadding="0" cellspacing="0"> <tr> <th bgcolor="#000000"><span class="style1">名前</span></th> <th bgcolor="#000000"><span class="style1">住所</span></th> <th bgcolor="#000000"><span class="style1">性別</span></th> </tr>'; #--------------------------------------------------------------# # ディレクトリにあるファイル名を取得 #--------------------------------------------------------------# while ($filename = readdir(DIR)) { # ディレクトリにあるファイルパスを取得 $path = "test/$filename"; if(-f $path) { # ファイルオープン open (IN, $path) or die "$!"; while (<IN>) { # カンマ区切りでデータを取得&改行削除 chomp(@data = split(/,/, $_)); print OUT "<tr>\n"; # 各行の3つのカンマ区切りデータを取得 print OUT "<th bgcolor=\"#666666\">",$data[0],"</th>\n<td>",$data[1],"</td>\n<td>",$data[2],"</td>\n"; print OUT "</tr>\n"; } close(IN); } } #--------------------------------------------------------------# # ディレクトリを閉じる #--------------------------------------------------------------# closedir(DIR); print OUT "</table> </body> </html>"; #--------------------------------------------------------------# # ファイルを閉じる #--------------------------------------------------------------# close(OUT);

    • ベストアンサー
    • Perl
  • VC++6でfgets関数の変わりになるような関数はあるのでしょうか。

    現在、VC++6を用いて、MFC を使わずにアプリケーションを作っています。 アセンブラ経験はありますが、C言語経験がないので、四苦八苦しています。 今回、 csv形式のファイルを読込んで、配列に格納したいのですが上手くいきません。 c言語の場合は、fopen関数で開いたファイルを、fgets関数で1行づつ読込み、 strtok関数で、処理すれば良いということが分かりました。 ところが、VC++6のCreateFile関数では、ファイルのポインタの変わりに、 クラスのハンドルが返ってくるので、fgets関数は使えないような気がします。 なにかfgets関数の変わりになるような関数はあるのでしょうか。 質問の意味が分かりずらいかと思いますが、適当に汲み取って教えて下さい。 宜しくお願いします。

  • ファイルの入出力

    あるフォルダにはいっているすべてのcsvファイルのデータをひとつのテキストファイルに出力したいのですが、うまくいきません。 わからなかったのでとりあえず、別々のファイルで下記を 実行してみました。 ■指定のフォルダに入っているファイル名をすべて出力。 これはうまくいきました。csvファイルが3つほど入っているのですが、 3つのファイル名が出力されます。 #!/usr/bin/perl opendir(IN,"test/"); while ($filename = readdir(IN)) { $path = "C:/perl/test/$filename"; $source = $filename; print $source,"\n" if -f $path; } ■指定のファイル(a.csv)の中身をtest.htmlとしてファイル出力 これもうまくいきました。カンマ区切りのデータが、 行ごとにあるだけはいっていき、htmlのテーブルにがつがつはいっていきます。 #!/usr/bin/perl my $source = "a.csv"; open (IN, $source) or die "$!"; my $dest = "test.html"; open (OUT, ">$dest") or die "$!"; print OUT '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=shift_jis" /> <title>無題ドキュメント</title> <style type="text/css"> <!-- .style1 {color: #FFFFFF} --> </style> </head> <body> <table width="419" height="105" border="0" cellpadding="0" cellspacing="0"> <tr> <th bgcolor="#000000"><span class="style1">名前</span></th> <th bgcolor="#000000"><span class="style1">住所</span></th> <th bgcolor="#000000"><span class="style1">性別</span></th> </tr>'; while (<IN>) { chomp; @data = split(/,/, $_); print OUT "<tr>\n"; print OUT "<th bgcolor=\"#666666\">",$data[0],"</th>\n<td>",$data[1],"</td>\n<td>",$data[2],"</td>\n"; print OUT "</tr>\n"; } print OUT "</table> </body> </html>"; つまり、この二つを1ファイルにまとめたいのです。 一個目で取得したファイル名リストを 2個目のopen で順次ファイルの中身を取っていってほしいのです。 いったんファイル名をテキストファイルに出力してから、 それを読む方法もあったのですが、 できたら、ファイルを出力せずに変数からそのまま、 ファイル名の一覧を取得したいと思っています。 どなたか教えていただけますでしょうか。

    • ベストアンサー
    • Perl
  • ファイルのデータを構造体に代入する方法

    学習し始めてから時間が経ちましたが、まだ初心者のまま・・・少しずつ頑張っている状態の者です。 今回はタイトルのことで御質問させてください。 関数Read(自己作成)でcsvファイルの内容を読み取り、読み取ったデータを用意しておいた構造体の変数ポインタを利用して代入しようと試みているのですが・・・要領がつかめません。 それで気になったのですが、読み込んだファイルを用意しておいた構造体に入れるにはどんな方法があるかよろしければご教授下さい。 私としてはforを使ったやり方があるのなら是非見本を見せてほしいのですが・・・ ちなみに、私が考えていたプログラム案は以下の通りです。 構造体にはcsvファイル・1レコード分の情報が入る構成。 構造体と読み取るファイルの構造は酷似しているが構造体全てに入る情報でない場合がある。 構造体には必要な分、配列領域を確保する ファイルの先頭アドレスはファイルポインタに代入。 構造体の先頭アドレスはポインタ変数に代入。   main関数とは別の関数の引数に2つのアドレスをコピー。 ★ そこでファイルデータを構造体へ代入しmainに戻って出力する。    その関数での戻り値は特になし(成功したら0・・・と考えていたのですが使い道が今のところはreturnだけです) ★で特に悩んでいるので、よろしくお願い致します。

  • 可変長構造体をファイルから読み込み処理

    可変長の構造体、 typedef struct 構造体(仮) { char c1,c2; float f1,f2; double d; int size; //↓strのサイズ char str[1]; //文字配列 }構造体(仮); の形式で書かれたバイナリデータファイルがあります。 そのファイルを読み込んでcsv形式で出力する処理を、 ファイルからの読み込む回数を減らしてやりたいと思っています。 その方法を教えていただけませんか? よろしくおねがいします。

  • ファイルからサイズ不明の行データを読み込む場合

    C言語でファイルからデータを読み込み、そのデータを編集しファイルに出力する というプログラムを作成しています。 ファイルデータはfgetsを使用し、読み込んでいます。 そこでお聞きしたいのですが現在、ファイル1行の最大サイズが不明のためfgetsで設定する 文字サイズをかなり大きくとってあります。 (とりあえず確認できた最大サイズが4000バイトだったので保険もかねて20000バイトを  設定しています) やはり文字サイズを大きくすると性能等に影響があるのでしょうか? また、ファイル1行の最大サイズが不明の場合、通常どのようにファイルを読み込むべき なのでしょうか? ご回答の方よろしくお願いします。

専門家に質問してみよう