質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Struts

StrutsはJava向けのWebアプリケーションフレームです。MVCモデルに基づいており、JSPやJavaサーブレットを組み合わせ、アプリケーション構築時に使用する各機能を提供しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

2112閲覧

【初心者】ファイル読み込みから構造体に追加→ファイル出力

tamatamagoo

総合スコア2

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Struts

StrutsはJava向けのWebアプリケーションフレームです。MVCモデルに基づいており、JSPやJavaサーブレットを組み合わせ、アプリケーション構築時に使用する各機能を提供しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/09/01 13:01

編集2020/09/01 13:18

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:123234                       A   山田  123 こんにちは 冒険  ぜひ読んで 144 タイトル:こんにちは|こんばんは →          A   田中  234 こんばんは ヒューマン 楽しんで 145 ジャンル:冒険|ヒューマン                           ・ 146 メッセージ:ぜひ読んで|楽しんで                        ・ 147 148上記の例はAクラスに山田さんと田中さんがおり、同一クラスの人たちの情報はまとめて記述されているというものです。 149こういった場合どのようにすればよいのかわかりません。 150 1513.なぜコアダンプになってしまうのか 152 153*構造体の変数は型以外変えています。ご了承ください。 154 155開発環境はLinuxです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2020/09/01 13:03

このままではコードが読みづらいので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
y_waiwai

2020/09/01 13:06

また、エラーが出るならエラーメッセージも提示しましょう。 まあ、、、いろいろ問題の多そうなコードですが。。
tamatamagoo

2020/09/01 13:20

>y_waiwaiさん ご指摘ありがとうございます。 エラーメッセージはコアダンプが出て強制終了したことしか覚えておりません。明日確認後詳細を追加します。 申し訳ありません。
guest

回答1

0

ベストアンサー

struct recordと、struct record2 はポインタのみで、ろくにナカミの領域を確保しないで、いろいろコピーしたりしてるので、メモリ破壊を起こしてます。

ポインタを定義したなら、必ず、そのナカミを格納する領域を確保しないといけません

#ポインタと配列やら、そこらへんを学び直す必要がありますね

投稿2020/09/01 13:55

y_waiwai

総合スコア87747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tamatamagoo

2020/09/01 14:37 編集

>y_waiwaiさん ご回答ありがとうございます。 ポインタと配列についてまだ知識が定着しておりませんでした。 今回の場合、構造体の中身をポインタではなく配列に変更すればよいのでしょうか。
y_waiwai

2020/09/01 14:45

配列に変更し、それに合わせてコードも修正の必要があります そーすれば、 struct record sr; read( input_fp , &sr , sizeof(sr) ); ってなことができるようになります
tamatamagoo

2020/09/01 23:17 編集

>y_waiwaiさん ありがとうございます。 アドバイスを参考に一度変更してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問