- ベストアンサー
C言語につて、教えてください!!
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
struct{ int cd,dvd,md; } data; FILE* fp = fopen(argv[1]. "r"); char str[256]; //1行読み込んだ文字列 char val[256] = null; void state(){ val = strchr(str,'|'); if(val = null) printf("error : |がない"); if( strcmp(str,"CD_DATA") ) data.cd = atoi(val+1); else if( strcmp(str,"DVD_DATA") ) data.dvd = atoi(val+1); else if( strcmp(str,"MD_DATA") ) data.md = atoi(val+1); } void main(){ int count=0; while(fgets(str,256,fp)){ state(); ++count; } if( (count%3) != 2) printf("error : 行数の不一致"); } 動作確認はしてませんが、こんな感じでしょうか? (簡素化のためにグローバル変数と構造体は一つしか持ってませんが) C言語でしたら、参考URLを見ればやりたい事は大体出来ると思います。 私も初心者ですが、精進の日々ですね。頑張って下さい。
その他の回答 (5)
- postal0x02
- ベストアンサー率42% (24/57)
仕様をまとめてみました。間違ってましたら指摘してください。 ・使用言語は C言語 である ・ファイルはテキストファイル(ASCII)である ・中身は 「CD_DATA|45」 「DVD_DATA|601」 「MD_DATA|24」 の3行である ・3行以外ならばエラーである ・1行には | が必ず1つなければならない (ない場合はエラー処理を行う) ・ | より後ろにはデータ(数字)があり、 数値に変換して構造体に格納する ・関数は メイン関数、読み込み関数 の2つである 以下は不明点です。 ・| より後ろがなくてもいいのか ・負の値は許可するのか ・質問者はファイルの読み込みに関する知識があるのか
- redfox63
- ベストアンサー率71% (1325/1856)
1) カウンタを0でクリア 2) ファイルから1行取得 3) カウンタを1加算 4) カウンタが3以上ならエラー処理 5) 読み込んだデータの先頭から CD_DATAなどがあるかをチェック 6) チャックが成功したなら | があるのかをチェック 7) |以降を 5でチェックしたアイテムに代入 8) 2へ戻って繰り返し といった手順をコードに起こしましょう 1) 2) 3) 4) 8) などのスケルトンを組んで 5) 6) 7) を肉付けしていくようにしてみてはいかがでしょうか
- Tacosan
- ベストアンサー率23% (3656/15482)
仕様に不明な点が多すぎ.... CD_DATA|45 などの「CD_DAT」などや | よりうしろの数字はこれらの値で固定ですか? 順序は不問ですか? 構造体にはどのように入れればいいのですか? 仕様とは関係ないですが, ファイルからデータを読み込むプログラムは書けますか?
- asuncion
- ベストアンサー率33% (2126/6288)
> テキストファイルの中の行数が違った時エラーメッセージをだす。 ファイルの中の行数が「何と」違ったときにエラーメッセージを出すのですか? 違うという判断をする、ということは、何か基準があってのことですよね。 その基準を示してください。
補足
#include <stdio.h> #include <string.h> #include <stdlib.h> #define AB 20; /*間違えてましたdefineです*/ struct s { char cd[AB]; char dvd[AB]; char md[AB]; } data; void out(data *,int arvc, char *argv[]); int main(int argc, char *argv[]) { data s[] = { {}, {}, {}, }; out(s, argc, argv); return(0); } void out(char *k, int argc, char *argv[]) { FILE *fp; if (argc != 2) { puts("入力された引数が異なります"); exit (1); } else if ((fp = fopen (argv[1]. "r")) == NULL ) { puts("ファイルがオープンできせん"); exit (1); } else { /* ここでファイルを読み込み、'|'より * 後ろを構造体に書き込みたい * のですけどうまくいきません */ } } 行数とはCD_DATA|45がファイルに無かった場合や MD_DATA|24の下にXXDATA|56など3行の他に4行目などが ある場合にエラー処理でエラーメッセージを表示さす事です。
何が「以上です」なのか判りませんが…。 判るところまで補足に記載しなさい。 それがここのルールです。 でも、 #include <stdio.h> int main(void){ } っていうのはなし。全く判らないと言うことですからね。 そう言うときは、教科書を読みましょう。
補足
#include <stdio.h> #include <string.h> #include <stdlib.h> #difain AB 20; struct s { char cd[AB]; char dvd[AB]; char md[AB]; } data; void out(data *,int arvc, char *argv[]); int main(int argc, char *argv[]) { data s[] = { {}, {}, {}, }; out(s, argc, argv); return(0); } void out(char *k, int argc, char *argv[]) { FILE *fp; if (argc != 2) { puts("入力された引数が異なります"); exit (1); } else if ((fp = fopen (argv[1]. "r")) == NULL ) { puts("ファイルがオープンできせん"); exit (1); } else { /* ここでファイルを読み込み、'|'より * 後ろを構造体に書き込みたい * のですけどうまくいきません */ } } 行数とはCD_DATA|45がファイルに無かった場合や MD_DATA|24の下にXXDATA|56など3行の他に4行目などが ある場合にエラー処理でエラーメッセージを表示さす事です。
関連するQ&A
- C言語の関数について困っています
こんにちは。 C言語で、テキストファイルの行数を数える関数があれば教えて頂けないでしょうか。例えば、以下の3行を含んでいるテキストファイルを対象としたとすれば 123465789123456789 1234567981234579 987654321987654321 関数を実行すれば、3という数字が得られ、 123456 789 123546879 123 123 456789123 123456789123 というテキストファイルであれば、4という数字が得られる。そんな関数をご存知な方は私にご教授願えないでしょうか。どうぞよろしくお願いします。
- 締切済み
- C・C++・C#
- C言語でのファイルのデータ更新について
C言語初級者です。 1行単位でデータが書いてあるファイルで、指定した行のデータを書き換えるようなプログラムはどのように記述すればよいのでしょうか。 必要な関数、処理の仕方など教授していただければと思います。 処理系はCygwinを使っています。 ファイルには五千行程度のデータが書いてあります。
- ベストアンサー
- C・C++・C#
- C言語のvoid型ポインタを使いたいのですが…
C言語のvoid型ポインタを使いたいのですが… 関数の引数として、void型ポインタを使おうと思ったのですが、内部でどのように処理すればいいのかわかりません キャストすれば問題なく使えるとのことですが、どの型でキャストするのかをどのように判断するのかがわかりません 具体的には、画像処理で画像の構造体をいくつか作ったのですが、それぞれの構造体ごとに関数を書くと関数が多くなるので、void型ポインタでまとめてつくろうとしています どのように型の判断を行えばいいのかを教えてください
- ベストアンサー
- C・C++・C#
- C言語の質問
Fortran言語にはsign(x,y)の関数があります、つまりxの絶対値をもち、かつyの符号をもつ値を生成する関数です。 C言語にこのような関数をも使いたいのですが、調べてみるとcopysignという関数がありました、関数の機能説明もFortaranのsignと同じとなっています。しかしながら、実際にCのソースファイルにcopysignを使うと、ビルド時に、「error C3861: 'copysign': 識別子が見つかりませんでした」のエラーが出てきました。また宣言時に「#include <math.h>も入れています。 どちら様がご存知ならば教えていただければ幸いなことです。 宜しくお願い致します!<^ ^>!!!
- 締切済み
- C・C++・C#
- C言語において、以下の条件で、ファイルに保存されているテキストデータを
C言語において、以下の条件で、ファイルに保存されているテキストデータを構造体に格納する方法を教えて下さい。 例題として、テキストファイルに保存されている社員データを構造体に格納するものとします。 初心者なので、記述内容が充分か分かりませんが、宜しくお願いします。 ---以下条件--- ・入力ファイルはテキスト形式(.txt)とし、ファイル名は「memberlist」とします。 ・ファイル(memberlist)には、社員1人につき、社員番号、名前、名前(ヨミガナ)が、「,」で区切られて存在するものとします。 また、、テキストファイルには一行につき社員1人のデータが存在するものとし、複数の社員データが同一行に存在することはありません。 テキストファイルの例). 10001,山田太郎,ヤマダタロウ, 10002,佐藤一郎,サトウイチロウ, 30010,池田悟,イケダサトル, ……………… ………………(続く) ・構造体は以下のように定義されているものとします。 なお、テキストファイルに何件の社員データがあるかは定義しませんが、 構造体の数は充分に確保されているものとします。 struct Person { int num; /*社員番号*/ char name[10]; /*名前*/ char kana[20]; /*名前(ヨミガナ)*/ }; struct Person List[100]; 上記の条件のもとでテキストファイルの内容を構造体に格納したいのです。 そこで以下のようなプログラムを作ってみましたが、エラーが発生してしまいます(後述)。 #include<stdio.h> /***構造体定義***/ struct Person { int num; /*社員番号*/ char name[10]; /*名前*/ char kana[20]; /*名前(ヨミガナ)*/ }; struct Person List[100]; main() /***変数の定義***/ FILE *rfp char rbuf[256]; char *tp; int i,size; /***ファイルオープン***/ rfp = fopen("memberlist.txt","r"); /*エラー処理省略(ファイルオープンは正常に終了したものとします)*/ /***構造体への格納処理***/ while(1){ size = fgets(rbuf,256,rfp); /*テキストデータを一行取得*/ tp = strtok(rbuf,","); /*テキストデータをカンマで区切る*/ sprintf(List[i].num,"%05d",tp); /*文字列を数値に変換し、社員番号を構造体へ*/ tp = strtok(NULL,","); /*テキストデータをカンマで区切る*/ strcpy(List[i].name,tp); /*名前を構造体へ*/ tp = strtok(NULL,","); /*テキストデータをカンマで区切る*/ strcpy(List[i].kana,tp); /*ヨミガナを構造体へ*/ if(size == NULL){ break; /*データを読み終えたら、ループを離脱*/ } } 上記のプログラムのエラー内容ですが、 まず、社員番号を文字列変換し格納するsprintf文で、 「パラメータ '__buffer' は signed char * 型として定義されているので int は渡せない(関数 main )」 というコンパイルエラーが発生します。 また、実行すると、Windowsからのエラー、「問題が発生したため、”プログラム名”を終了します。~~~」というプログラムが強制終了される時に出現するエラーが発生します。 可能性としてどのような問題が考えられますか?よろしくお願いします。
- ベストアンサー
- C・C++・C#
- C言語のfopenについて教えてください。
C言語のfopenについて教えてください。 ある1つのファイルをr(テキストファイル読み込みモード)でfopenしたとします。 そのファイルをfcloseする前に、同じファイルが再度rモードでfopenされても問題ないのでしょうか? 何を気にしているかと言いますと、あるプログラムであるファイルをrモードでfopenして読み込む処理があるのですが、そのプログラムを呼び出す処理が複数あります。 確率は低いと言えど、もし同時にその処理が実行された場合、rモードでfopenしているファイルにfclose前に再度rモードのfopenがされたらエラーとなってしまうのでしょうか? もし、エラーとなる場合、回避する方法がありますか? また、エラーとならない場合は、fcloseするまで次の処理が待ってしまうのでしょうか? 読み込みモードだから問題ないのかなとも思ったのですが、どなたかご存知だったら教えてください。 よろしくお願いしますm(_ _)m
- ベストアンサー
- C・C++・C#
- C言語について質問です。教えてください。
C言語について質問です、教えてください。 以下のようなテキストファイルがあるとします。 apple,111 orange,222 grape,333 lemon,444 banana,555 一行ずつorange というものがあるかないかを探して、 なければ次の行を検索、 あれば、その該当行のカンマで区切った二つ目のデータ(ここでいう222)を とってきて、break処理 どのようにくめばいいでしょうか>< 誰か教えてください。 よろしくお願いいたします。
- 締切済み
- C・C++・C#
お礼
ありがとうございます!! 参考URLとソースのおかげで、期限までに終わらす事ができました。