visualstudio2010を使用しています。
c言語で書いているのですが、

test.txt ←abcdefg ファイルサイズ1KB
Wtest.txt←書き込み用ファイル
上記のようなファイルがあり、バイナリでtest.txtを読み込みWtest.txtに書き込みたいと思っています。

その際に、1KBのtest.txtを5KBになるまでバイナリで「abcdefg」の後に0を代入したいのですがどう書けば良いのかわかりません。

FILE *fp, *fpw;
char *fname = "test.txt";
char *fname_w = "Wtest.txt";
unsigned char buf[10000];
int size;

fp = fopen( fname, "rb" );
if( fp == NULL ){
printf( "%sファイルが開けません\n", fname );
return -1;
}

fpw = fopen(fname_w, "wb");
if(fpw == NULL){
printf( "%sファイルが開けません\n", fname_w );
return -1;
}

size = fread( buf, sizeof( unsigned char ), sizeof (fp), fp );

/*ここに処理を追加したい*/

fwrite( buf, sizeof( unsigned char ), size, fpw);

このQ&Aに関連する最新のQ&A

A 回答 (2件)

>size = fread( buf, sizeof( unsigned char ), sizeof (fp), fp );



ここ、何がしたい?

「sizeof (fp)」が何を意味するか判ってる?

fpってのは「ポインタ変数」だから「その処理系で、ポインタを表すのに必要なバイト数になる」っての、理解してる?

処理系が64ビット系なら「sizeof(ポインタ変数)」は、常に「8」になる。

処理系が32ビット系なら「sizeof(ポインタ変数)」は、常に「4」になる。

処理系が16ビット系なら「sizeof(ポインタ変数)」は、常に「2」になる。

まず「test.txtの中身を、丸々、そのままWtest.txtにコピーするプログラム」を作ってみよう。

今は、先頭の1キロバイトさえもちゃんとコピー出来てないから、お話にならない。

丸コピープログラムが出来たら、test.txtの中身が、1バイトでも、3バイトでも、10バイトでも、20バイトでも、100バイトでも、きちんと「丸々、そのまま、コピー出来ている事」を確認しよう。

話はそれからだ。

この回答への補足

int main(void)
{
FILE *fp, *fpw;
char *fname = "test.txt";
char *fname_w = "Wtest.txt";
unsigned char buf[10000];

for(int i = 0; i < 10000; i++){
buf[i] = 0;
}

fp = fopen( fname, "rb" );
if( fp == NULL ){
printf( "%sファイルが開けません\n", fname );
return -1;
}

fpw = fopen(fname_w, "wb");
if(fpw == NULL){
printf( "%sファイルが開けません\n", fname_w );
return -1;
}

fread( buf, sizeof( unsigned char ), 10000, fp );

fwrite( buf, sizeof( unsigned char ), 10000, fpw);

return 0;
}

100バイトまでコピーすることができました。
これが100メガバイトや1ギガバイトになって、実行するとプログラムが終了しました。となってしまうのですが、それはなぜでしょうか?

補足日時:2011/04/10 10:35
    • good
    • 0

ファイルを読み込む前に、bufをすべて0で埋めておけば、ファイルのデータを読み込んだ部分以外は0になるので、bufを5120byt

e分ファイルに書き出せばいいのでは?

この回答への補足

回答有り難うございます。
教えていただいたとおり0で初期化してからでできました。
しかしファイルサイズを大きくしたときに失敗してしまいました。。。

補足日時:2011/04/10 10:36
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング

おすすめ情報