C++
1include <stdio.h> 2include <stdlib.h> 3include <string.h> 4include <dirent.h> 5include <iostream> 6using namespace std; 7 8struct record{ 9 char* class; 10 char* name; 11 char* number; 12 char* title; 13 char* kind; 14 char* message; 15}; 16 17struct record2{ 18 char* class2; 19 char* name2; 20 char* number2; 21 char* title2; 22 char* kind2; 23 char* message2; 24}; 25 26int filter(const struct *fl){ 27 const char *p=strrchr(fl->d_name,'.'); 28 return p && !strcasecmp(p,".INI"); 29} 30 31int main(int argc,char *argv[]{ 32 33if(argc !=2){ 34 cout<<"引数にディレクトリを指定してください"<<endl; 35 return 1; 36} 37 38FILE *input_fp; 39FILE *output_fp; 40char* input_file; 41char* output_file; 42char* dir; //読み込みファイルまでのパスのアドレス 43char* fileName; 44 45output_fp=fopen("class.csv","wb"); //出力ファイル読み込み 46 47if(output_fp==NULL){ 48 cout<<"ファイルオープンできませんでした"<<endl; 49} 50 51char file_list[64]; //.INIファイルのみを入れる配列(後にコピーをする際にchar*型が必要と感じたので入れています) 52char* pl; 53file_list=pl; 54 55struct dirent **fileList; //filter関数で使う 56 57record rcd; 58record2 rcd2; //構造体 59 60record r1[256]; //構造体配列の生成 61struct record *sr; 62sr=r1; 63 64record r2[256]; 65struct record2 *sr2; 66sr2=r2; 67 68char* pcw; 69char* pcs; //指定文字のポインタを格納するもの 70 71char val[256]; //一列読み込んだものを一時的に格納する配列 72char* p1; 73p1=val; 74 75int n=scandir(argv[1],&fileList,filter,NULL){ 76 77if(n<0){ 78 perror("scandir"); 79 return 2; 80} 81 82if(n>0){ 83 for(int i=0;i<n;i++){ 84 pl=fileList[i]->d_name; //抽出したファイルを配列に格納 85 dir=argv[1]; //引数のディレクトリ(対象ファイルがこのディレクトリ内にあるため) 86 87 strcat(input_file,dir); 88 strcat(input_file,"/"); 89 strcat(input_file,pl); 90 91 input_fp=fopen(input_file,"rb"); 92 93 if(input_fp==NULL){ 94 cout<<"ファイルオープンできませんでした。"<<endl; 95 } 96 97 while(!feof(input_fp)){ 98 memset((char*)sr,'\0',sizeof(r1)); 99 memset((char*)sr2,'\0',sizeof(r2)); 100 memset(p1,'\0',sizeof(val)); 101 102 pcw=NULL; 103 pcs=NULL; 104 105 strcpy((char*)sr,pl); 106 107 fgets(pl,sizeof(val),input_fp); 108 109 pcw=strstr(p1,"["); 110 pcs=strstr(p1,"]"); 111 112 *pcs='\0'; 113 114 strcpy((char*)sr,pcw+1); 115 116 fwrite(&rcd,sizeof(record),1,output_fo); 117 118 } 119 } 120 121 } 122 123} 124 125上記まで書き、一度試してみようと思い実行したところできませんでした。 126 127この後の展開もわからず壁にぶつかっている状況ですのでヒントを頂けたらと思い質問しました。 128 129ご回答よろしくお願いいたします。 130``` 131行いたいこと:構造体を利用したファイル入出力 132 133フォルダ内にあるテキストファイル(.INI)を読み込み、別の拡張子(.csv)として出力するツールを作成しています。 134 135 136現在、下記のソースを実行するとメモリをセットした段階でコアダンプになってしまいます。 137 138◎今回質問したいこと 1391.ファイルを読み込み→構造体変数に入れるにはどうしたらよいか 1402.ファイル内に同じタイトルのものがありそれぞれ値を格納したいときはどのようにすればよいか 141(例)[Aクラス] 142 名前:山田|田中 (イメージ図) クラス 名前 ID タイトル ジャンル メッセージ 143 ID:123|234 A 山田 123 こんにちは 冒険 ぜひ読んで 144 タイトル:こんにちは|こんばんは → A 田中 234 こんばんは ヒューマン 楽しんで 145 ジャンル:冒険|ヒューマン ・ 146 メッセージ:ぜひ読んで|楽しんで ・ 147 148上記の例はAクラスに山田さんと田中さんがおり、同一クラスの人たちの情報はまとめて記述されているというものです。 149こういった場合どのようにすればよいのかわかりません。 150 1513.なぜコアダンプになってしまうのか 152 153*構造体の変数は型以外変えています。ご了承ください。 154 155開発環境はLinuxです。
回答1件
あなたの回答
tips
プレビュー