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;
}
}
No.1ベストアンサー
- 回答日時:
変数cは、宣言だけされていて初期化されていないんじゃないですか?
また、
>if(ncd[n].sex==c){
>if(data[i-1].number > data[i].number){
これらの式は、ポインタの値を比較していて、文字列を比較しているのではありません。
動作に影響はありませんが、
>atoi(ncd[i].number);
整数に変換した結果がそのまま捨てられていますね。
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);
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
C言語のプログラムで、途中で止...
-
fread(),fwrite()等について
-
2進数の表示
-
fscanfの使い方
-
2÷3などの余りについて
-
C言語で%を使わない余りの出し方
-
比較回数と交換回数表示について
-
信頼区間の1.96や1.65ってどこ...
-
nCmの関数
-
複数桁10進数の*桁目だけを抽出...
-
Notepad++の関数リスト表示の変...
-
C言語のfor文です。 繰り返しの...
-
break文でループを一気に抜ける...
-
正負を反転させて出力するプロ...
-
#define _CRT_SECURE_NO_WARNIN...
-
error C2143: 構文エラー : ';'...
-
プログラムでの数字につく”f”の...
-
既定のコンストラクタがありま...
-
hit&bolwのプログラミングがで...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
C言語で複数列のデータを1列の...
-
#defineが使用するメモリ領域に...
-
printf による16進表示について
-
空白を含んだ文字列がうまく格...
-
C言語のプログラムで、途中で止...
-
プログラミングの授業の課題です
-
char型2つを結合し、short型に...
-
C言語でのCSVファイルの読み出...
-
矢印キーを押下してコンソール...
-
【C言語】全角文字の配列を、全...
-
エラーについて質問です。
-
リストの作成と出力(C言語)
-
バイナリファイル(画像)のよみ...
-
[C]セグメンテーションエラー:...
-
WinInetのInternetOpenUrl関数...
-
VC++でSQLへSELECT文を送ったの...
-
受信データから必要な部分のみ...
-
c言語で文書を読み込み、単語の...
-
reallocでエラー
おすすめ情報