• ベストアンサー

一行データから構造体・配列への格納処理について

初めて投稿します。 ▲実現したい処理内容 1)ファイルを読み込む。 2)読み込んだデータを独自定義した構造体データ配列に格納する。 3)格納した構造体データをパラメータに引き渡す。 ▲ファイルデータについて ・連続した文字列(カンマなどの区切りはなし) ・一行のみ --------10--------20--------30 abcdefgあいうえ123456789012 ▲条件 構造体を使う以外になし ▲状況 今のところ、自分でわかっているのは >2)読み込んだデータを独自定義した構造体データ配列に格納する。 の処理で、 ************************************************************** <最終的に渡すパラメータの型やサイズは決まっているので、 決まった文字サイズでデータから文字を切り出し、操作して パラメータへ渡す>処理で実現できる ************************************************************** なんですが、 構造体を使うロジックで実現しようとし、 関数は freadが適当であるということをアドバイスされましたが、 リファレンスの内容が理解できず困っています。 ファイルを開いて、 char buffer[256]; fgets(buffer, sizeof(buffer), fp); でbufferに文字列を格納する部分までは実現&理解できております。 ご教示いただければ幸いです。 よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

>関数は freadが適当であるということをアドバイスされましたが、 fwriteを使って書き出したなら、freadを使うのがいいというような意味では? 別にfreadにこだわらなくても、fgetsで一行読み込みで読み込んでいるのだから、それから構造体メンバにコピーすればいいと思う。 >決まった文字サイズでデータから文字を切り出し… strncpyとか、memcpyを使えばいいと思うけど

take_off090
質問者

お礼

回答ありがとうございます。 今回は、ファイルがもともとあり、そのファイルを オープン&リードする処理です。 > ...構造体メンバにコピーすればいいと思う。 先ほど答える!ANo.1でも回答致しましたが、 ソースでの実現ができておりません。 > strncpyとか、memcpyを使えばいいと思うけど そうですね。文字切り出しについては、 書いていただいた関数を使用することで いけると思います。 今まで、VBしか言語経験しかなく、 CでのPGM製造で改めてCでのデータの考え方や データ型、コードの難しさを身にしみています・・・(;´Д`)ウウッ…

その他の回答 (1)

  • g_vikke
  • ベストアンサー率16% (15/90)
回答No.1

結局、2)をしたいのか、freadの使い方がわからないのかどっちだろ? バッファに入れるまでは出来てるんでしょ? バッファから構造体へコピーしたらいいだけじゃないの? 1つ1つでもいいし、構造体1バイトパック前提で、一括でコピーでもいいし。 それともコピーの仕方がわからない?

take_off090
質問者

お礼

回答ありがとうございます。 > 結局、2)をしたいのか、freadの使い方がわからないのかどっちだろ? Freadの使い方がわかりません。 引数は何を入れるかも良く理解できていません。 作るための仕様(処理順)は理解している状態です。 > それともコピーの仕方がわからない? はい、現状ではソースでの実現の仕方がわかりません。 投稿の後、基礎から確認しています。

関連するQ&A

  • 2次元配列への格納方法について

    こんにちは。 FILE *fp; SIZE 1024; int n; char Buf[1025]; while((n = fread(Buf,1,SIZE,fp)) != 0){ } というように、fread関数を用いて1024バイトずつ配列Bufへ格納しています。 以下に示すようなことを行う場合、どのように記述すればよいのでしょうか? B:バイナリデータ T:数値 TBBBBBBBBB・・・・・・B←1024バイト目 TBBBBBBBBB・・・・・・B ・ ・ ・ ・ TBBBBBBBBB・・・・・・B というように、配列内に格納したいと思っています。 Tは、テキストデータで1,2,3・・・・100という整数型を格納。Bは、バイナリデータでfread関数から取得したバイナリデータを格納します。 なぜ、Tを格納したいかといいますと、どのバイナリデータを指しているか?を判別するためです。 上記のようなことを行うためには、2次元配列を使用すればよいのでしょうか? 例:char Buffer[100][1025]

  • ファイルから構造体へデータを格納(動的メモリ割り当て)

    C言語の勉強をしいております。 typedef struct address { char names[32]; /* 名前 */ char tels[32]; /* 電話番号 */ struct address *prev; /* 前のリスト */ struct address *next; /* 次のリスト */ }Address; という構造体へ、ファイルから読み込んだテキストデータ(名前と電話番号がTABで区切られている)を格納したいのですが、配列ではなく、動的にメモリを確保しながら格納する方法を教えていただけないでしょうか? 処理の流れとしては、 ・1つめの構造体の*prevにはnullを入れておく。 ・1つめの構造体へファイルの1件目のデータを格納する。 ・ファイルのデータがまだある場合には、malloc関数を使ってメモリを確保し、malloc関数からの戻り値を1つめの構造体の*nextへ格納する。 ・構造体へ2件目のデータを格納する。 このような感じだろうという程度しか分からず、ソースも書けずにいます・・・。 配列を使用したサンプルはあるんですが、動的に処理を行う方法を教えていただけないでしょうか? よろしくお願いいたします。

  • ファイルから読みこんで構造体に格納する、

    shohinというファイルに RX-100 odango_tsumeawase 3000という のが 五行ならんでいるのですが、 これを読み込んで struct shohin{ char code[10]: char name[40]; int price; } にファイルから読みこんで構造体配列に 格納したいのですが、構造体配列に格納する やりかたがわかりません。 構造体配列は struct shohin list[];というのを宣言しています。 ファイルから一行読み込んで fprintf()を使おうと思うのですが、 それはできますか? メンバ毎に格納したいのですが、 それがわかりません お願いします。

  • 文字列を格納する配列を、動的なメモリ確保で処理したい

    文字数が一定でない文字列の一覧を、配列に格納したいと思っています。 "AAA" "BBBBB" "CC" このような文字列を配列に格納するのに普通にやるなら char test[3][24]; for(i=0;i<3;i++){ strcpy(test[i],file[i]); } (便宜上、file[0]には、"AAA",file[1]には"BBBBB"が格納されてるとします) こうやると、test[3][24]の24バイトとか余計に確保した分が無駄になるので、 必要な文字列の長さだけ配列を確保したいと考えています。 で、 char *test[3]; for(i=0;i<3;i++){ //sizeには、各文字列のサイズが格納してあります。ここではその部分省略しますが test[i]= (char*)malloc(size); strcpy(test[i],file[i]); } とやれば (イメージで) test[0]= "AAA" test[1]= "BBBBB" test[2]= "CC" となると思ったのですが、うまく処理されませんでした。 このような処理をさせたい場合根本的に違うのでしょうか。 わかりにくい説明ですが、どなたかご存知の方よろしくお願いします

  • データ数の多い構造体配列について

    visual c++で配列をメンバーに持つ構造体配列を定義したいと思っています。 しかし、以下のように定義してもプログラムが実行されません。 配列の容量が大きいのかもしれませんが、 大量のデータを扱いたいので容量を小さくはしたくありません。 大量のデータを扱うのに何かいい方法はないでしょうか。 struct X { double A[1000]; }; : : : struct X B[10000];

  • AWKの配列内データの処理について

    AWKを使用して入力ファイルの1行内の単語に対して条件チェックするには for( i=1 ; i<= NF i++ ){    if( $I == chek_word )       処理 } とすればできるのはわかるのですが、 一旦、配列の中に格納した文字列に対して上記の処理と同様の処理をするにはどのようにすればいいのでしょうか? 例えば data_line[$1] = $0; として配列data_lineに格納した1行そのままのデータに対して1番上の行全体にわたる単語の条件チェック をおこないたいのですが、どのようにすればいいのかよくわかりません。 どなたかご存知の方アドバイスをお願いします。

  • 可変長構造体をファイルから読み込み処理

    可変長の構造体、 typedef struct 構造体(仮) { char c1,c2; float f1,f2; double d; int size; //↓strのサイズ char str[1]; //文字配列 }構造体(仮); の形式で書かれたバイナリデータファイルがあります。 そのファイルを読み込んでcsv形式で出力する処理を、 ファイルからの読み込む回数を減らしてやりたいと思っています。 その方法を教えていただけませんか? よろしくおねがいします。

  • 一意の文字列を構造体に格納したい

    VisualBasic6.0で開発を行っています。 あるデータを取得するときにキーが重複しているデータが存在し、構造体に一意に格納したいのですが、重複した文字列は処理を省くようにできる関数などはありませんでしょうか? DBで一意に取得が一番いいのでしょうが、それができないような形になっています。 アドバイスお願いいたします。

  • 構造体→文字列→構造体 をする方法

    VB6.0の話です。  不特定の構造体を文字列(String)に格納し、これを最初の構造体に戻す事はできませんか?  具体的には「共有メモリを使い構造体を文字列にして格納>別ウインドウで文字列を取得して構造体に戻す」と言う事をやりたいんです。  共有メモリに不特定の構造体をいれる方法でもいいんですが…VALIANTだとサイズが大きすぎて実用性がありませんし、違う主旨の質問をするのも良くないので回答はあくまで「構造体→文字列→構造体 をする方法」と言う事でお願いします。

  • 構造体の中身の2次元配列をファイルに書き込むことができるのでしょうか?

    構造体の中身の2次元配列をファイルに書き込むことができるのでしょうか? 現在、入力したデータをファイルに保存するプログラムを作成しております。 fp = fopen(file_name, "wb"); fwrite( &save_data, sizeof(save_data_t), 1, fp ); このように構造体ごとファイルに書き込んでいるのですが、 fread()で読みだした時に、2次元配列が読み込まれていません。 (おそらく書き込み自体ができていなかったのだとおもいます。) どのようにすれば、構造体の中に含まれている 2次元配列を書き込むことができるのでしょうか? c言語初心者ですので、是非ともよろしくお願いします。 typedef struct Save_Data{ int s_num; char s_page[][260]; }save_data_t; save_data_t save_data;

専門家に質問してみよう