読み込んだファイル内のテキストを並べ替えて新しいファイルを作成して入力

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

読み込んだファイル内のテキストを並べ替えて新しいファイルを作成して入力

#1

投稿記事 by 素人マン » 8年前

タイトル通りの課題のプログラム作成で悩んでいる者です

私は以下のことをするプログラムを作成しています
[1]①読み込んだファイルから文字列を分割
  ②分割した文字列を構造体内の配列に入れる
  ③構造体内の配列を並び替えて出力する
  ④出力した配列からname2ごとにテキストファイルを作成し、ファイルに書き込む
  ⑤ファイルを閉じて、作業を読み込んだファイルが終わるまで作業を続ける

現在、④以外のコーディングはできたのですが、それ以外ができていません

[2]現在作成中のプログラムコードは以下のようになります

コード:

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

#define PET1 "DOG "
#define PET2 "CAT "
#define PET3 "RAT "

/* 配列のデータの構造体 */
typedef struct petnum{
	char name1[100]; // My
	char name2[100]; //ペットの種類
	char name3[100]; //ペットの名前
	char name4[100]; //性別
	char name5[100]; //age
	char name6[100]; //年齢
	char name7[100]; //birthday
	struct petnum *next;
}petnum;

int main(void)
{
	char fileName[100];

/* 入力データ */
	static char look[200];

/* 検索・絞り込み用配列 */
	char search1[] = PET1;
	char search2[] = PET2;
	char search3[] = PET3;

/* 区切り文字 */
	static char cut[] = {" :"};

	char *tok; //文字列分割用
	FILE *fp; //ファイル読み込み用
	petnum head; //先頭データ格納用構造体
	int count; //格納したデータの個数をカウント

/* 読み込むログファイルを入力させる */
	printf("ファイル名を入力してください。\n");
	scanf("%s", fileName);

	fp = fopen(fileName, "rb+"); //読み込んだファイルを読み書きできるようにする

/* 入力したファイルが存在しなければ処理を終了 */
	if(fp == NULL)
	{
		printf("ファイルをオープンできませんでした。\n");
		return 1;
	}

/* 入力したファイルが存在すれば処理を続行 */
	else
	{
		printf("ファイルをオープンしました。\n");
	}

/* 各入力データ処理 */
	while(fgets(look, 200, fp)!= NULL)
	{
		count = 0; //格納データのカウントをリセットする

/* 構造体の各要素 */
		char *target[] = {
			head.name1, head.name2, head.name3, head.name4, head.name5, head.name6, head.name7
		};

/* 文字列の抜き出し */
	if(strstr(look, search1) || strstr(look, search2) || strstr(look, search3))
	{
		tok = strtok(look, cut); //文字列を分割

/* 文字列が取り出せなくなるまで処理を行う */
		while(tok != NULL)
		{

/* 取り出した文字列が区切り文字ではなく、格納先の要素が残っているならば格納を行う */
			if(strcmp(tok, cut) >= && (size_t)count < sizeof(target) / sizeof(*target))
			{
/* 格納してカウントする */
				strcpy(target[count], tok);
				count++;
			}
			tok = strtok(NULL, cut); //次の文字列を取得

/* 抜き出した文字列を出力する */
		if (6 <= count && count <= 7)
		{
			if(count == 6)
			{
				printf("[%s %s %s %s]\n", target[2], target[1], target[3], target[5]);
			}
			else if(count == 7)
			{
				printf("[%s %s %s %s %s]\n", target[2], target[1], target[3], target[6], target[5]);
			}
		}

/* ここまで文字列の抜き出し */
	}
	fclose(fp);//ファイルをクローズする
	printf("ファイルをクローズしました\n");

	return 0;
}
分かりにくくて申し訳ありませんが、ファイルを開いている中でファイル作成するためのコードが全く分からずに困っています

[3]現在発生しているエラーはこのようになっています

コード:

prog.cc: In function 'int main()':
prog.cc:80:30: error: expected identifier before '(' token
    if(strcmp(tok, cut) >= && (size_t)count < sizeof(target) / sizeof(*target))
                              ^
prog.cc:80:30: error: expected ')' before '(' token
prog.cc:106:1: error: expected '}' at end of input
 }
 ^
prog.cc:106:1: error: expected '}' at end of input
読み込むファイルはmypet.txtというファイルです
内容は

コード:

My pet Deta : Hasegawa
My DOG : John Male age 4 4/23
My CAT : Mary Female age 3 
My RAT : Ann Female age 1 8/14
My RAT : Jack Male age 1 8/14
となっており、ペットの種類ごとにファイルを作成し、ファイルに出力するということをするプログラムを作成しています

例としてDOGのプログラムを作成するのならば、ファイルの名前はpet_DOG.txtというファイルを作成し、中身は

コード:

John DOG Male 4 4/23
というものを作成したいです。
要望が多くて申し訳ありませんが、アドバイスや参考にする文献を紹介していただけると幸いです

作成環境はC++で、私自身、c言語は最近学習を始めたばかりでライブラリ関数や構造体、ポインタ、配列、ファイル作成はまだ学習中です

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

Re: 読み込んだファイル内のテキストを並べ替えて新しいファイルを作成して入力

#2

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

素人マン さんが書きました:要望が多くて申し訳ありませんが、アドバイスや参考にする文献を紹介していただけると幸いです
とりあえず、本題と関係無いエラーを修正するといいでしょう。
それとも、テンプレートに合わせるためにわざとコンパイルエラーを用意した、ということでしょうか?
困っていることは
素人マン さんが書きました:現在、④以外のコーディングはできたのですが、それ以外ができていません
素人マン さんが書きました:ファイルを開いている中でファイル作成するためのコードが全く分からずに困っています
でいいと思います。
素人マン さんが書きました:[3]現在発生しているエラーはこのようになっています

コード:

prog.cc: In function 'int main()':
prog.cc:80:30: error: expected identifier before '(' token
    if(strcmp(tok, cut) >= && (size_t)count < sizeof(target) / sizeof(*target))
                              ^
prog.cc:80:30: error: expected ')' before '(' token

>=演算子で比較する対象(右辺)が書かれていませんね。
素人マン さんが書きました:

コード:

prog.cc:106:1: error: expected '}' at end of input
 }
 ^
prog.cc:106:1: error: expected '}' at end of input
62行目および77行目の{に対応する}が無いようですね。
71行目からインデントがおかしくなっているので、整えるといいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

閉鎖

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