ファイルの読み込みと構造体の組み合わせ

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

ファイルの読み込みと構造体の組み合わせ

#1

投稿記事 by かいん » 9年前

text.txtを読み込んで読み込んだファイルから番号を指定し、その指定した番号で色の番号、光度、名前を出力するというプログラムを作成しているのですが24行目のファイル内の文字列の読み込みと26行目の出力ができません。
24行目の部分でfscanf(fp, "%d,%d,%s", data.number,data.koudo,data.name);と3つに分けて読み込み、
26行目でprintf(fp, "%d,%d,%s", data.number,data.koudo,data.name);で出力できるようにしたいのですが何処に問題があるのですか?
上記を入力すれば式にはクラス型が必要です。と表示されエラーとなってしまいます。
この状態ではエラーは何も出ず、出力すると何も関係がない数字と文字が表示されるだけです。

textの内容
1 22 aka
6 14 ao
4 15 kiiro
7 16 kuro
3 12 midori

コード:

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>

struct iro{
	int number;
	int koudo;
	char *namae;
};

int main(void){
	
	int num,i;
	FILE *fp;
	struct iro data[100];
	printf("色の番号を指定してください。");
	scanf("%d",&num);

	if ((fp = fopen("text.txt", "r")) == NULL){
		printf("not open file \n");
		exit(EXIT_SUCCESS);
	}
	
		fscanf(fp, "%d,%d,%s", data);

			printf("%d,%d,%s", data, data, data);

		fclose(fp);
	return 0;
}

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: ファイルの読み込みと構造体の組み合わせ

#2

投稿記事 by みけCAT » 9年前

かいん さんが書きました:24行目の部分でfscanf(fp, "%d,%d,%s", data.number,data.koudo,data.name);と3つに分けて読み込み、
26行目でprintf(fp, "%d,%d,%s", data.number,data.koudo,data.name);で出力できるようにしたいのですが何処に問題があるのですか?
上記を入力すれば式にはクラス型が必要です。と表示されエラーとなってしまいます。
dataがstruct iroではなく配列であることが問題です。
また、data.numberやdata.koudoはポインタではないので、fscanfに渡して読み込むことはできません。
どうしてもこのコードで読み込みたければ、このコードに対応した新しい言語を開発してください。
(dataを&data[0]にマクロ定義しても、今度はdata.nameの部分で未定義動作になってしまうのでダメです)
さらに、printfの第一引数が書式文字列ではなくFILE*型のfpである所もC言語ではダメです。
かいん さんが書きました:この状態ではエラーは何も出ず、出力すると何も関係がない数字と文字が表示されるだけです。
fscanfの引数が足りず、またfscanfやprintfの可変長引数の部分に間違った型のデータを渡しているので、未定義動作が発生します。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

かいん

Re: ファイルの読み込みと構造体の組み合わせ

#3

投稿記事 by かいん » 9年前

うまく出力するためにはどのように変更すればいいですか?

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: ファイルの読み込みと構造体の組み合わせ

#4

投稿記事 by みけCAT » 9年前

  • 配列を使いたければ、その要素に対して読み書きをしましょう。
  • 関数に正しいデータを渡しましょう。
  • 読み込みが成功したかのチェックをするといいでしょう。
  • 事前に文字列を読み込む領域を確保しなければいけません、
  • 入力の書式文字列に邪魔なコンマがあるので、消すといいでしょう。
  • malloc.hは非標準なので、必要が無ければ使うべきではありません。

コード:

#include<stdio.h>
#include<stdlib.h>

struct iro{
	int number;
	int koudo;
	char *namae;
};

int main(void){
	
	int num,i;
	FILE *fp;
	struct iro data[100];
	printf("色の番号を指定してください。");
	scanf("%d",&num);

	if ((fp = fopen("text.txt", "r")) == NULL){
		printf("not open file \n");
		exit(EXIT_SUCCESS);
	}

	if ((data[0].namae = malloc(1024)) == NULL) {
		printf("not allocate memory \n");
	} else if (fscanf(fp, "%d%d%s", &data[0].number, &data[0].koudo, data[0].namae) == 3){
		printf("%d,%d,%s", data[0].number, data[0].koudo, data[0].namae);
	} else {
		printf("not read file \n");
	}

	free(data[0].namae);
	fclose(fp);
	return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

box
記事: 2002
登録日時: 14年前

Re: ファイルの読み込みと構造体の組み合わせ

#5

投稿記事 by box » 9年前

コード:

#include <stdio.h>
#include <stdlib.h>

typedef struct {
    int number;
    int koudo;
    char namae[40];
} IRO;

int main(void)
{
    int num;
    FILE *fp;
    IRO data;
    printf("色の番号を指定してください。");
    scanf("%d", &num);

    if ((fp = fopen("text.txt", "r")) == NULL) {
        printf("not open file \n");
        exit(EXIT_FAILURE);
    }

    while (fscanf(fp, "%d%d%s", &(data.number), &(data.koudo), data.namae) == 3) {
        if (data.number == num) {
            printf("%d, %d, %s\n", data.number, data.koudo, data.namae);
        }
    }
    fclose(fp);
    return 0;
}
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

かいん

Re: ファイルの読み込みと構造体の組み合わせ

#6

投稿記事 by かいん » 9年前

ありがとうございます。
自分で色々と追加して無事にできました。
機会があればまたお願いします。

閉鎖

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