プロが教える店舗&オフィスのセキュリティ対策術

C言語について教えて欲しいです。
ファイルの中身をコピーするプログラムを作ってます
aというファイルには11111が入ってるとします。

while(fread(&c,1,1,fpin)==1)
{
 fwrite(&c1,1,fpout)
}
解答はこうなってましたが、
freadの返り値は読み込んだデータの個数なので、ここでは1個なのでaのファイルの1個目の1しかコピーできなくないですか?

私は以下のようにしてました。
fread(&c,1,5,fpin);
fwrite(&c1,5,fpout);

A 回答 (7件)

https://bituse.info/c_func/43
C言語 fread 使い方
■書式
「ファイルオープン時はファイルポインタはファイルの先頭にありますが、
読み込むとそのバイト数分だけファイルポインタが後ろにずれます。
この仕組みにより順番にファイルを読み込んでいくことが可能になっているわけです。」

https://bituse.info/c_func/44
C言語 fwrite 使い方
    • good
    • 0

>1バイトしか読み込まないなら、永遠に最初の文字を読み込むと思ったのですが...


間違いです

>この関数は一つ目の1バイトを読み込んだら勝手に次の1バイトを読み込む仕様ということでしょうか?
そうですよ。あってます。
    • good
    • 0

fwriteは4個の引数を要求するはずだがね…


質問する前にコンパイル出来たのかね???
    • good
    • 0

その「c」とやらがなんなのか, こっちにはさっぱりわからんのだが.

    • good
    • 0
この回答へのお礼

int cです。

お礼日時:2022/11/03 23:41

一回のfread&fwriteでは1バイトずつですが、それをwhileでファイルの終わりになるまで繰り返すので、ファイル全体を読み書きします。


返り値は0か1しかあり得ませんが、「返り値が0」であれば「ファイルが終わり」ということです(厳密には読み取りエラーの可能性もあるが)。

fread(&c,1,5,fpin);
と書いても、返り値は0か5だけでなく1~4という可能性も考慮する必要があります。
    • good
    • 0
この回答へのお礼

1バイトしか読み込まないなら、永遠に最初の文字を読み込むと思ったのですが...
この関数は一つ目の1バイトを読み込んだら勝手に次の1バイトを読み込む仕様ということでしょうか?

お礼日時:2022/11/03 23:40

>freadの返り値は読み込んだデータの個数なので、ここでは1個なのでaのファイルの1個目の1しかコピーできなくないですか?



はい。
そうなります。
ただし、そのfread()の戻り値でwhileループするとどうなるでしょう?
    • good
    • 0
この回答へのお礼

whileループしても最初の1バイトを読み込み続けるだけだと思ったのですが、この関数は最初の1バイトを読んだら自動で次の1バイトを読むという仕様なのでしょうか?

お礼日時:2022/11/03 23:45

>fread(&c,1,5,fpin); fwrite(&c1,5,fpout);


・6バイト以上のファイルを正しくコピーできない。
・変数cの型がただのcharならメモリ破壊を起こす。
――恐れがあるコードかと。
    • good
    • 0

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