PBMデータの保持方法について

このQ&Aのポイント
  • PBMデータを保持するためには、構造体を使用するのが適切です。
  • 画像データを連続した値として格納するには、一行ずつではなく、一文字ずつ読み込んで格納する必要があります。
  • pbm_dataという配列を作成し、読み込んだ値をその配列に連続して格納することで、画像データを保持できます。
回答を見る
  • ベストアンサー

PBMのデータを保持するにはどの方法がいいでしょうか?

こんにちは。私は30代の男性です。 pbmについて勉強しているのですが、例えば P1 24 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 1 1 1 1 0 0 1 1 1 1 0 0 1 1 1 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 1 1 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 1 1 1 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 1 1 1 0 0 1 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 というデータがあった時、マジックナンバー・画像の幅・画像の高さのそれぞれのデータを読み込んで何らかの配列に格納する場合は、「構造体」がよろしいでしょうか? fgetsとstrtokを使って「P 24 7」までは1行ずつ読み取って格納できたとしても、その次の画像データを格納する配列をpbm_dataとして「0と1」を格納するとき、一行ずつ読み込んだのでは、配列に連続した値として格納することができないかなという疑問が湧きました。 どのようにしたら他のデータも読み込んだあとに、画像データを連続した値として格納することができるでしょうか? どなたかよきアドバイスをお願い致します。

  • DT50
  • お礼率95% (504/530)

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

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.1

★一般論 ・C言語なら構造体、C++言語ならクラスなどで読み込んでデータを管理するのか  一番すっきりするでしょうね。C++言語ならばメンバ関数でやり取りを出来ます。 ・あと1行ずつ読み込むと配列に連続した値として格納できないのでは?ってどういう事?  複数の『pbm』画像データを連続して読み込んだとき、その複数の画像データの部分が  連続しているように格納したいということですか?  この辺の部分をもう少し補足してくれますか? ・それから、BMP画像の読み込み、書き出しは成功しているため、『pbm』の画像データも  同じような構造体で管理するという方法はどうでしょうか。→横、縦、データ部のみ。  また、画像データ部はchar型の配列に横(24桁)×縦(7列)=168バイトに連続して格納  していき、横サイズ、縦サイズからchar型配列で1行の長さと計算させて取り出す仕組み  にするのはどうでしょう。 構造体: struct pbm_t {  int no; // マジックナンバー  int sx; // 画像の幅  int sy; // 画像の高さ  char img[ 1 ]; } pbm_t; 解説: ・上の構造体はメンバ img が可変長のデータを格納するようにするため [1] というサイズに  なっています。この構造体をメモリ(malloc)で確保するとき、画像の横×画像の縦+構造体の  サイズを足した容量を確保します。こうすれば、構造体 pbm_t で画像の縦と横が変動しても  char 型の img 配列でデータを連続して管理できます。→BMP画像ファイルなどと考えは同じです。 ・以上。参考に!

DT50
質問者

お礼

Oh-Orange様 いつもご回答ありがとうございます。プログラムを完成させることができました。 >・あと1行ずつ読み込むと配列に連続した値として格納できないのでは?ってどういう事? >複数の『pbm』画像データを連続して読み込んだとき、その複数の画像データの部分が  連続しているように格納したいということですか? > この辺の部分をもう少し補足してくれますか? このことについては解決したので大丈夫です。 >・上の構造体はメンバ img が可変長のデータを格納するようにするため [1] というサイズに  なっています。この構造体をメモリ(malloc)で確保するとき、画像の横×画像の縦+構造体の  サイズを足した容量を確保します。こうすれば、構造体 pbm_t で画像の縦と横が変動しても  char 型の img 配列でデータを連続して管理できます。 この方法は思いつきませんでした。次回に活かします。ありがとうございました!

関連するQ&A

  • strtok

    strtokにて分解した文字を各変数に格納する場合 char *p; FILE *fp; char buf[1000]; if((fp = fopen("○","r"))==NULL){ return 0; } if(!fgets(buf,1000,fp)) return 0; strcpy(p, buf); number = strtok(p,","); class_type = strtok(NULL,","); name = strtok(NULL,","); subject = strtok(NULL,","); と一行の文字列を各変数に格納しています。 ファイルの一行は以下のような形式になっています。 1,A,山田,数学//番号,クラスタイプ,名前,得意教科 これで各値は変数に格納できています。 しかし このファイルはCSVファイルなのですが、空の欄があると 1,A,,数学というデータがbuf内に入っています。 この場合 number→1 class_type→A name→数学 と空欄の箇所が飛ばされてしまっています。 改善する方法がわからないのですが strtokを使わない方がいいのでしょうか?

  • 改行されたtxtファイルの読み込み(C++)

    3374356,4785323,7043817,5111179,8267572, 6486903,3258714,6344689,8620512,7434933, 8088837,8231528,6524254,5928445,7101798, 5338215,5233711,4753647,5930266,7512232, 5343749,5813061,6439450,6257874,5724787, 5864114,9006652,4871427,6158077,7343041, 7615426,7168142,5866379,8154664,7342803, という形式のデータ数1000のtxtファイルがあります。 解析に使用したいのでCに読み込みたいのですが、方法が調べても分からず困っています。とりあえず以下が、データが一行の際に使用しているソースコードです。 FILE *fp; char linebuf[4096]; char *p; int array[1024]; int data=0; fp=fopen("randombetarev.txt","r"); if(!fp) return 1; fgets(linebuf,4096,fp); fclose(fp); p=strtok(linebuf,","); do{ array[data]=atoi(p); data++; }while(p=strtok(NULL,","));//ここまででデータを配列に格納 これでは改行の判別ができないので初めの一行目のデータしか読み込めません。どなたかご教授ください。

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

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

  • CSVファイル読込みのエラーに関して??

    下にプログラムの一部を書いてます。 このプログラムでは、b[g]にあたるCSVファイルを読み、 csv_value[j4][i4]に格納しようとしています。 しかし、すべての列で1列目の値が配列に格納されてしまいました。 間違いがわからずに困っています。 もし詳しい方がいましたら教えていただけないでしょうか? どうかよろしくお願いいたします。 char b[1000][50]; long g; long i4; long j4; char str0[500000]; long line_number; g=0; fp = fopen(b[g],"r"); for(i4=0;i4<line_number;i4++){ fgets(str0,500000,fp); for (j4=0;j4<32;j4++){ csv_value[j4][i4]=atoi(strtok(str0,",")); } }

  • C# 行列のデータ数

    例えば int [ , ,]data=[9999,9999,9999] という配列を作成し,この配列にデータを格納したとします. そこで,data[1,2,X]の時のXの値を前者の1と2を指定したときに取得することは 可能でしょうか. また,可能であればどのようにすればいいでしょうか?

  • ファイルからのデータ読み込み方法について

    はじめまして、数ヶ月前からC言語を始めたものです。 ファイルからのデータ読み込みについて質問です。 テキストファイルとして以下のようなものがあります。 ************************* 23 3346 45 423 34 23 345 45 56 6345 ・・・ ・・・ ************************* このようなファイルから読み込みを行って、スペース毎の数字(整数型)を構造体の中の変数に順次格納していくようなプログラムを作りたいとおもうのですがどのように行ったらいいのでしょうか? 現在、fgets()で行ごとの文字列を読み込んでから、型変換を行おうと心みているのですが、うまくいきません。 回答よろしくお願いします。

  • [arduino]数値の大きなデータを二次配列へ

    シリアル通信で得たデータを二次元配列へ格納するために、 以前では、 if(Serial.available()>120){ for(int k=0;k<8;k++){ for(int l=0;l<15;l++){ //読み込んだ値を配列に代入 matrix[k][l]=Serial.read(); } } } このようなやり方で読み込んだ値を二次元配列に代入していたのですが、 128個以上のデータを扱いたい場合、Serial.availableでは保持できず、困っています。 方法として、 (1)一つずつデータを読み込み、128回ループを繰り返し配列に貯めていく。その後配列を2次元配列に代入する。 (2)一つデータを読みこんだら二次元配列の1行目1列目のドットに格納、もう一つデータを読みこんだら二次元配列の1行目2列目のドットに格納…というように、 読みこんだデータをそのまま二次元配列のそれぞれの場所へ格納していく。 というような二つの方法を思いついたのですが、 (1)の方法では、配列にデータを貯蓄していくコードをこのように↓書いたのですがうまくいかず、 for(int i=0;i<128;i++){ if(Serial.available()>0){ data[128] = Serial.read(); } } (2)の方法では、データを二次元配列のそれぞれの場所へ格納していく指定方法が分かりませんでした。 正しい書き方や、良いアイデアをお持ちの方がいましたら、是非御教授お願いします。

  • ファイルからデータを読み込んで、配列に格納する方法

    データファイル grep.dat があり、その中は 12345 67890 ABCDE (EOF) となっています。   このファイルの中身を読み込んで、配列 P[0]の 中に("12345","67890","ABCDE") に格納したい のですが、どのように記述すればよいでしょうか。

    • ベストアンサー
    • Perl
  • 配列について

    こんにちは。 int p[1000]という整数型の配列を作成しました。 例えば、 p[0] = 1; p[1] = 2; p[2] = 3; ・ ・ ・ p[99] = 100; を格納し、配列の長さ?を調べる際、 unsigned int len = 0; while(p[len]!='\0') len++; とすることで調べることが可能でしょうか?p[100]番以降に0が格納されている場合それがナル文字となるのでしょうか? また、char c[1000]と文字列型の配列を作成し、文字列の数値を格納していく場合、一桁であれば要素1個(1Byte?)で格納できますが、二桁以上であれば要素2個以上(2Byte以上←あっていますでしょうか)必要です。 c[0]='1' c[1]='2' c[2]='3' c[3]='4' ・ ・ ・ c[9]='1' c[10]='0' c[11]='1' c[12]='1' ・ ・ ・ ここで問題なのですが、文字列10と文字列11の判別はできないのでしょうか? 110111が連続している場合も値110と値111と判別できないのでしょうか? 値を格納する場合は、整数型のint c[1000]を用意するという事でしょうか? よろしくお願いします。

  • 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からのエラー、「問題が発生したため、”プログラム名”を終了します。~~~」というプログラムが強制終了される時に出現するエラーが発生します。 可能性としてどのような問題が考えられますか?よろしくお願いします。