リスト構造体ポインタにcsvファイルを読み込みたい

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

リスト構造体ポインタにcsvファイルを読み込みたい

#1

投稿記事 by ゆーさく » 2年前

 [1.1] 質問内容
   リスト構造体ポインタにcsvファイルを読み込みたい
 [1.2] 詳細

かなり省略しましたがリスト構造体にユーザーが値を入力したものを表示させるプログラムです。
読み込みたいcsvファイルは以下の通りです。

コード:

"ID" ,"名前", "住所", "誕生日","電話番号"
"1" ,"aaa", "bbb", "111", "222"
これをfscanfで構造体ポインタに読み込もうとすると、うまく読み込んでくれません。原因もわからず、わかる方いましたら、回答いただけると幸いです。


以下コードです。

コード:

 
 #include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define NAME_LEM_MAX 10
#define ADDRESS_LEM_MAX 64
#define BIRTH_LEM_MAX 10
#define NUMBER_LEM_MAX 16
#define NO_PROBLEM 0
#define ERROR 1

typedef struct student
{
	char id;
	char name[NAME_LEM_MAX + 1]; 
	char address[ADDRESS_LEM_MAX + 1]; 
	char birth[BIRTH_LEM_MAX + 1];  
	char phone_number[NUMBER_LEM_MAX + 1]; 
    struct student *next;  // 次のデータがある場所
} PERSON_t;

static PERSON_t *head = NULL; // リストの先頭 ノードが存在するアドレス
static PERSON_t *tail = NULL; // リストの末尾

int add_person(int id);
int delete_person(void);
int change_person(void);
int save_person(void);
int read_person(void);
void  person_result(void);
void get_string(char *str, unsigned int num);
int get_person_id(PERSON_t *p);
int get_person_name(PERSON_t *p);
int get_person_address(PERSON_t *p);
int get_person_birth(PERSON_t *p);
int get_person_phone_number(PERSON_t *p);

int main(void)
{
    int number = 0;
	int id = 0;
	int ret;
	int end_flag = 0;
	enum select;
	PERSON_t *current, *data;
	FILE *fp;
	
    while(end_flag == 0)
    {
		printf("---------------------------------------------\n");
        printf("1.一覧\n2.一件表示\n3.追加入力\n4.変更\n5.削除\n11.保存\n12.読み込み\n0.終了\n ");
		scanf("%d",&number);
		fflush(stdin);
        switch(number){
       		case 1:
				person_result();
				break;
			case 2:
				person_result();
				break;
			case 3:
				id++;
	            ret = add_person(id); 
				if(ret == NO_PROBLEM){
					puts("追加完了");
				}
				break;
			case 4:
				ret = change_person();
				if(ret == NO_PROBLEM){
					puts("変更完了");
				}
				break;
       		case 5:
				ret = delete_person();
				if(ret == NO_PROBLEM){
					puts("削除完了");
				}
				break;
        	case 11:
				puts("保存");
				puts("-------------\n");
				ret = save_person();
				if(ret == NO_PROBLEM){
					puts("保存完了");
				}
				break;
        	case 12:
				puts("読み込み");
				puts("-------------\n");
				ret = read_person();
				if(ret == NO_PROBLEM){
					puts("読み込み完了");
				}
				break;			
        	case 0:
				puts("終");
				end_flag = 1;
				break;
			default:
				//何もしない
				break;
        }
		
    }

	return 0;
}

int read_person(void)
{
	int ret = NO_PROBLEM;
	PERSON_t *data;
	FILE *fp;  //file型構造体
	
	free(data);
	
	fp = fopen("test.txt", "r");   //読み込みモードファイルをで開く
	if( fp == NULL ){
		perror("失敗\n");
		return ERROR;
	}else{
		puts("成功\n");
	}
	
	
	data = (PERSON_t *)malloc(sizeof(PERSON_t));
	fscanf(fp, "%d%s%s%s%s", &data->id, data->name, data->address, data->birth, data->phone_number) ;
	printf(" %d\n %s\n %s\n %s\n %s\n",&data->id, data->name, data->address, data->birth, data->phone_number);
	

	return ret;
}
 
 
 
[2] 環境  
 [2.1] OS : Windows,
 [2.2] コンパイラ名 : Cpad

超初級者
記事: 56
登録日時: 9年前

Re: リスト構造体ポインタにcsvファイルを読み込みたい

#2

投稿記事 by 超初級者 » 2年前

線形リストの前に、
ダブルクォーテーションで囲んである
カンマ区切りのテキストファイルを
思ったとおりに読めるコードを
書く練習をする方がよいと思います。

超初級者
記事: 56
登録日時: 9年前

Re: リスト構造体ポインタにcsvファイルを読み込みたい

#3

投稿記事 by 超初級者 » 2年前

そもそも
うまく読み込んでくれない
っていう現象をもっと具体的に
説明しないとまともな回答は
付かないですよ。

アバター
あたっしゅ
記事: 663
登録日時: 13年前
住所: 東京23区
連絡を取る:

Re: リスト構造体ポインタにcsvファイルを読み込みたい

#4

投稿記事 by あたっしゅ » 2年前

東上☆海美☆「
ちょっと、やってみたが

コード:

//
// https://dixq.net/forum/viewtopic.php?f=3&t=21162&sid=1c559273d5b444ad2c10b379b18332e0
// リスト構造体ポインタにcsvファイルを読み込みたい - ミクプラ(ja)
//
// for VS2019
//
#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define NAME_LEM_MAX 10
#define ADDRESS_LEM_MAX 64
#define BIRTH_LEM_MAX 10
#define NUMBER_LEM_MAX 16
#define NO_PROBLEM 0
#define ERROR 1


typedef struct student
{
	char id;
	char name[NAME_LEM_MAX + 1];
	char address[ADDRESS_LEM_MAX + 1];
	char birth[BIRTH_LEM_MAX + 1];
	char phone_number[NUMBER_LEM_MAX + 1];
	struct student* next;  // 次のデータがある場所
} PERSON_t;

static PERSON_t* head = NULL; // リストの先頭 ノードが存在するアドレス
static PERSON_t* tail = NULL; // リストの末尾

//int add_person(int id);
//int delete_person(void);
//int change_person(void);
//int save_person(void);
int read_person(void);
//void  person_result(void);
//void get_string(char* str, unsigned int num);
//int get_person_id(PERSON_t* p);
//int get_person_name(PERSON_t* p);
//int get_person_address(PERSON_t* p);
//int get_person_birth(PERSON_t* p);
//int get_person_phone_number(PERSON_t* p);


int
main(void)
{
	int number = 0;
	int id = 0;
	int ret;
	int end_flag = 0;
	//enum select;
	PERSON_t* current, * data;
	FILE* fp;

#if 0
	while (end_flag == 0)
	{
		printf("---------------------------------------------\n");
		printf("1.一覧\n2.一件表示\n3.追加入力\n4.変更\n5.削除\n11.保存\n12.読み込み\n0.終了\n ");
		scanf("%d", &number);
		fflush(stdin);

		switch (number) {
		case 1:
			person_result();
			break;
		case 2:
			person_result();
			break;
		case 3:
			id++;
			ret = add_person(id);
			if (ret == NO_PROBLEM) {
				puts("追加完了");
			}
			break;
		case 4:
			ret = change_person();
			if (ret == NO_PROBLEM) {
				puts("変更完了");
			}
			break;
		case 5:
			ret = delete_person();
			if (ret == NO_PROBLEM) {
				puts("削除完了");
			}
			break;
		case 11:
			puts("保存");
			puts("-------------\n");
			ret = save_person();
			if (ret == NO_PROBLEM) {
				puts("保存完了");
			}
			break;
		case 12:
#endif
			puts("読み込み");
			puts("-------------\n");
			ret = read_person();
			if (ret == NO_PROBLEM) {
				puts("読み込み完了");
			}
#if 0
			break;
		case 0:
			puts("終");
			end_flag = 1;
			break;
		default:
			//何もしない
			break;
		}
	}
#endif
	return 0;
}


int
read_person(void)
{
	int ret = NO_PROBLEM;
	PERSON_t* data;
	FILE* fp;  //file型構造体

	//free(data);

	fp = fopen("test.txt", "r");   //読み込みモードファイルをで開く
	if (fp == NULL) {
		perror("失敗\n");
		return ERROR;
	}
	else {
		puts("成功\n");
	}


	data = (PERSON_t*)malloc(sizeof(PERSON_t));
	//
	// http://simd.jugem.jp/?eid=49
	// C言語 CSVファイルの読み込み - stdio.h - [ fscanf ] - 勇躍のゴミ箱(ja)
	//
	//fscanf(fp, "%d%s%s%s%s", &data->id, data->name, data->address, data->birth, data->phone_number);
	char id[ 256 ];
	fscanf(fp, "%[^,],%s,%[^,],%s,%[^,],%s,%[^,],%s,%[^,],%s\n", &id, data->name, data->address, data->birth, data->phone_number);

	//printf(" %d\n %s\n %s\n %s\n %s\n", &data->id, data->name, data->address, data->birth, data->phone_number);
	printf(" %s\n %s\n %s\n %s\n %s\n", &id, data->name, data->address, data->birth, data->phone_number);


	return ret;
}

// end.
出力

コード:

読み込み
-------------

成功

 "ID" 
 "名前",
 ヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘ����5
 ヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘ����5
 ヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘ����5
読み込み完了
駄目だったみみ
VTuber:
東上☆海美☆(とうじょう・うみみ)
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。

中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。

返信

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