前提・実現したいこと
ここに質問の内容を詳しく書いてください。
ファイルをバイナリデータで読み込んで16バイト~32バイト単位で逐次変換をしていきたい。
変換する関数は作成して16バイト単位で逐次処理していきたいと思います。
読み込んで処理する方法がよくわかっていません。
今までは16バイトだけのファイルを読み込んで変換をしていましたが、これを写真とか大きなサイズにした場合どうすればいいのかわかりません。
配列を[1024*1024]のサイズを用意して配列に入れ込むか逐次処理するかという感じなのですが、
メモリやファイルサイズを考えないで実行したいと考えています。
下記は関数を作成したときの一部です。
aの16バイトをbと組み合わせてcの戻り値を得るという感じです。
#include <stdio.h> #include <stdlib.h> #include"aaa.h" int main(){ int i,j; FILE* fp1,*fp2,*fp3; unsigned char a[16]= {0}; unsigned char b[16]= {0}; unsigned char c[16]= {0}; unsigned char r[16]= {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, 0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f}; unsigned char output[16]; fp1 = fopen( "syashin.jpg", "rb" ); if( fp1 == NULL ){ printf( "ファイルオープンに失敗しました。\n" ); exit( 1 ); } fread( a, sizeof(char), sizeof(a), fp1 ); fclose(fp1); fp2 = fopen( "b.bin", "rb" ); if( fp2 == NULL ){ printf( "ファイルオープンに失敗しました。\n" ); exit( 1 ); } fread( b, sizeof(char), sizeof(b), fp2 ); fclose(fp2); fp3 = fopen( "output.bin", "wb" ); if( fp3 == NULL ){ printf( "ファイルオープンに失敗しました。\n" ); exit( 1 ); } aa=a^r kansuu(a,b,c); c=output; fwrite( output, sizeof(char), sizeof(output), fp3 ); fclose(fp3); } ``` ### 試したこと 配列aを[1024*1024]と大きな配列を用意 サイズが分からないのでnと仮定 ここに言語を入力 ``` for(i=0;i<n;i++){ n= fread( a, 16 sizeof(a), fp1 ); kansuu(a,b,c); } ``` aの配列で16バイトずつ読み込んでcの配列に16バイトずつ変換してそのままファイルに書き込んでいくイメージです。 関数がkansuu(unsigned char *a,unsigned char *b,unsigned char c[16])としていましたが 16バイトずつになるのでkansuu(unsigned char a[16],unsigned char *b,unsigned char c[16])としていましたが になるのかといろいろ試行錯誤していますが、よくわかりませんのでご教授願います。 全部一度に読み込んで配列に入れ込む方法と逐次にやる方法等サンプルコードでもいいので概要が分かるものをわかるとありがたいです。よろしくお願いします。 ### 補足情報(FW/ツールのバージョンなど) C言語 VisualStudioCode
質問に付けているタグ(「関数」「データ構造」など)ですが、「C」に変更してください。そうすることでC言語に詳しい人たちに質問が届くようになり、回答が得られる可能性が高まります。
「C」のタグを購読している人:7398人 https://teratail.com/tags/C
「関数」のタグを購読している人:149人 https://teratail.com/tags/%E9%96%A2%E6%95%B0
いま付けているタグは購読者が少ないので、全て外していいと思います。基本的にプログラミング言語のタグだけを付ければ大丈夫です。
ありがとうございます。Cの部分抜けてました。該当しそうなでできてたタグつけてただけでした。修正してみました。
ファイルからデータを少しずつ読み込んで逐次処理するやり方でいけるのか、それともファイル全体を一括で読み込んでメモリ内に格納してから処理するべきなのかは、処理内容によってどちらがいいか変わると思うので、想定している課題が前者で済むかどうかをとりあえず決めると良いかと思いました。(前者では出来ない処理も想定しているなら必然的に後者になると思うので)
回答ありがとうございます。
ファイルサイズ的には前者でいけると思っていますが試行錯誤中なのでなんとも言えませんが変換して書き込んでいくイメージなんですが標準入出力処理を勉強中です。後者の方法のほうも勉強中です。
> ファイルサイズ的には前者でいけると思っていますが
これはファイルサイズがどのぐらい大きいものか分からないので前者でやらざるを得ないのではないかという意味でしょうか?
そうでないのなら前者でいけるかどうかの判断基準はファイルサイズではなく、少しずつ読み込んでいくデータを、その次のデータを読み込む際には捨てていかないといけないことになるがそれで目的の処理を行うことが出来るかどうかです。
捨てることが出来ないのなら最初から後者の処理でいくことを考えたほうが良いのではないでしょうか?
捨てることが出来ないのなら、後者のメモリに全部読み込む方法以外に、ファイルからseekしてはreadするを繰り返して必要な情報をその都度読み込んで処理していくやり方もあります。処理は遅くなるとは思います。
ありがとうございます。
〉
これはファイルサイズがどのぐらい大きいものか分からないので前者でやらざるを得ないのではないかという意味でしょうか?
そうです。わからない場合を考慮してです。今は練習なのでファイルサイズは小さくメモリ的にもどちらでもいけると思ってます。
読み込んだあとは捨てる方向で考えております。
次の処理を行うことを考えればseekで探してそこから取ってくる方法になるのは調べててわかりました。どの処理も読み込みかたと読み込んだあと配列に入れて関数に型に合わせるというのがうまくいかずわからないです。
メモリで全て読み込んで[16]を何個も保持することを考えると[ i ][16]と二次元配列になるけどそうすると関数と合わなくなりエラーになってしまいます。
回答1件
あなたの回答
tips
プレビュー