• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:至急お願いします!!)

CSVファイルを読み込んで構造体に格納する方法と女性データの抽出・ソート方法

このQ&Aのポイント
  • CSVファイルを読み込んで構造体に格納する方法と、格納したデータを標準出力する方法についてご説明します。
  • また、女性のデータを抽出して標準出力する方法についても解説いたします。
  • さらに、抽出したデータをナンバーで昇順にソートし、標準出力する方法についても詳しく説明いたします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

変数cは、宣言だけされていて初期化されていないんじゃないですか? また、 >if(ncd[n].sex==c){ >if(data[i-1].number > data[i].number){ これらの式は、ポインタの値を比較していて、文字列を比較しているのではありません。 動作に影響はありませんが、 >atoi(ncd[i].number); 整数に変換した結果がそのまま捨てられていますね。

その他の回答 (1)

回答No.2

起動はコマンドプロンプトから ./a.out meibo.csv のように、CSVファイル名を引数として指定してください。 また、CSVファイルの読み取りは while(fscanf(fp, "%[^,],%[^,],%[^,],%s",ncd[i].number,ncd[i].name,ncd[i].sex,ncd[i].tel) != EOF) { http://simd.jugem.jp/?eid=49 を使いたかったのですが、当方の Gccコンパイラと相性が良くありませんのでしたので、質問の回答に合わせてあります。 /* An answer by Gcc on Mac OSX * file name: matsuo.c * compile: gcc matso.c * execution: ./a.out <CSVファイル> */ #include <stdio.h> #include <stdlib.h> //exit() #include <string.h> #define MAX_NUMBER_LENGTH 30 #define MAX_NAME_LENGTH 20 #define MAX_SEX_LENGTH 2 #define MAX_TEL_LENGTH 20 #define MBF 256 #define SIZE 20 struct NameCard{ char number[MAX_NUMBER_LENGTH]; // 番号 char name[MAX_NAME_LENGTH]; // 名前 char sex[MAX_SEX_LENGTH]; // 性別 char tel[MAX_TEL_LENGTH]; // 電話番号 }; /* プロトタイプ宣言 */ int number_comp(const void *, const void *); int main(int argc, char *argv[]) { FILE* fp; // ファイルポインタ用 char ch[MBF]; // 文字入力用 int n, i = 0; struct NameCard ncd[SIZE]; if(argc != 2 || (fp = fopen(argv[--argc], "r")) == NULL) { printf("ファイルをオープンできません?n"); exit(1);/* 強制終了 */ } while(fgets(ch,MBF,fp) != NULL) { strcpy(ncd[i].number,strtok(ch,",")); strcpy(ncd[i].name,strtok(NULL,",")); strcpy(ncd[i].sex,strtok(NULL,",")); strcpy(ncd[i].tel,strtok(NULL,",")); i++; } fclose(fp); /* ファイルクローズ */ printf("読み込んだファイルを表示します?n"); for (n = 0; n < i; n++) printf("%s,%s,%s,%s",ncd[n].number,ncd[n].name,ncd[n].sex,ncd[n].tel); printf("女性のリスト?n"); for(n=0;n<i;n++) { if(*ncd[n].sex=='F') { printf("%s,%s,%s,%s",ncd[n].number,ncd[n].name,ncd[n].sex,ncd[n].tel); } } /* ソーティング */ qsort(ncd, i, sizeof(struct NameCard), number_comp); printf("ソート後?n"); for(n=0;n < i;n++) { printf("%s,%s,%s,%s",ncd[n].number,ncd[n].name,ncd[n].sex,ncd[n].tel); } return(0); } /* NumberCard.number[] の比較 */ int number_comp(const void *_p0, const void *_p1) { struct NameCard *p0 = (struct NameCard *)_p0; struct NameCard *p1 = (struct NameCard *)_p1; return strcmp(p0->number, p1->number); }