CSVファイルを読み込んで構造体に格納し、格納したデータを標準出力、女性のデータだけを標準出力、その後データのナンバーを昇順にソートし標準出力しようとしていますが、下2つが上手く出力できません・・・
どなたか、間違いを指摘してもらえませんか?

CSVファイルの内容
*****************************************************************
022023,金沢聖悟,M,012-345-6789
022011,鈴木信也,M,123-456-7890
022025,佐々木小太郎,M,901-234-5678
032002,加田宮千代子,F,890-123-4567
032011,ラスコーニ・イワンチャコフ,M,789-012-3456
032020,渡辺真,M,678-901-2345
032050,加藤江美,F,567-890-1234
042007,萩原雄一,M,456-789-0123
042010,井上麻衣,F,345-678-9012
042014,カイ・ハンセン,M,234-567-8901
042035,近松門左衛門,M,111-222-3333
042044,セルビア・モンテネグロ,F,555-555-5555
**************************************************************

プログラム
***************************************************************
#include <stdio.h>
#include <stdlib.h>
#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

struct NameCard{
char number[MAX_NUMBER_LENGTH]; // 番号
char name[MAX_NAME_LENGTH]; // 名前
char sex[MAX_SEX_LENGTH]; // 性別
char tel[MAX_TEL_LENGTH]; // 電話番号

};


void swap(struct NameCard * ,struct NameCard *);
void sort(struct NameCard [], int );



int main(void)
{
FILE* fp; /* ファイルポインタ用 */
char *ret; /* ファイル名用 */
char *c,ch[MBF]; /* 文字入力用 */
int i = 0;
int n,k;



struct NameCard ncd[20];





if((fp = fopen("meibo.csv", "r")) == NULL)
printf("ファイルをオープンできません\n");
//exit(1);/* 強制終了 */

else{
printf("読み込んだファイルを表示します\n");
while ( fgets(ch,MBF,fp) != NULL){
//printf("test\n");
strcpy(ncd[i].number,strtok(ch,","));
strcpy(ncd[i].name,strtok(NULL,","));
strcpy(ncd[i].sex,strtok(NULL,","));
strcpy(ncd[i].tel,strtok(NULL,","));

atoi(ncd[i].number);

printf("%s,%s,%s,%s",ncd[i].number,ncd[i].name,ncd[i].sex,ncd[i].tel);
i++;




}
//printf("%s\n",ncd[0].sex);
//printf("%s\n",ncd[1].sex);
//printf("%s\n",ncd[2].sex);
//printf("%s\n",ncd[3].sex);

printf("女性のリスト\n");
for(n=0;n<i;n++)
{
//printf("test\n");
if(ncd[n].sex==c){
//printf("test\n");
printf("%s,%s,%s,%s",ncd[n].number,ncd[n].name,ncd[n].sex,ncd[n].tel);
}else;


}

}





sort(ncd, i);


printf("ソート後\n");
for(k=0;k < i;k++)
{
printf("%s,%s,%s,%s",ncd[k].number,ncd[k].name,ncd[k].sex,ncd[k].tel);
}



fclose(fp); /* ファイルクローズ */






return(0);
}



void swap(struct NameCard *x,struct NameCard *y)
{
struct NameCard temp = *x;
*x = *y;
*y = temp;
}

void sort(struct NameCard data[], int n)
{
int k = n - 1;
while(k >= 0){
int i,j;
for(i = 1,j = -1; i <= k; i++)
if(data[i-1].number > data[i].number){
j = i - 1;
swap(&data[i],&data[j]);
}
k = j;
}

}

A 回答 (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);
}
    • good
    • 0

変数cは、宣言だけされていて初期化されていないんじゃないですか?


また、

>if(ncd[n].sex==c){
>if(data[i-1].number > data[i].number){

これらの式は、ポインタの値を比較していて、文字列を比較しているのではありません。

動作に影響はありませんが、

>atoi(ncd[i].number);

整数に変換した結果がそのまま捨てられていますね。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

今、見られている記事はコレ!

おしトピ編集部からのゆる~い質問を出題中

お題をもっとみる

このQ&Aを見た人が検索しているワード


このカテゴリの人気Q&Aランキング

おすすめ情報

カテゴリ