導航:首頁 > 文件教程 > fread大文件讀取

fread大文件讀取

發布時間:2023-05-15 15:57:14

㈠ fread函數怎麼讀取文件的全部內容

fread是一個函數。從一個文件流中讀數據,最多讀取count個元素,每個元素size位元組,如果調用成功返回實際讀取到的元素個數,如果不成功或讀到文件末尾返回 0。 函數原型 size_t fread ( void *buffer, size_t size, size_t count, FILE *stream)...

㈡ 文件函數fread()獲取文件的內容的問題,在線等,急啊!

fread的原型見353951452的回答。
我建議可以這樣寫:
//聲明用到的變數
unsigned char fa[3];
unsigned short ret;
unsigned short idx;
//從文件中讀取最多兩個位元組的數據
ret=fread(fa, 1, 2, fp);
//根據返回的讀取到的數據數量,按十六進制的方式和相應的ASCII方式列印出來。
for (idx=0;idx<ret;idx++) {
printf("0x%02x(%c) ", fa[idx], fa[idx]);
}
printf("\n");

㈢ C語言 用fread讀文件的大小

使用fseek(fh, 0, SEEK_END)到文件末尾,然後調用ftell(fh),得到的就是文件大小。

㈣ fread大概只能讀10k

錯誤原因:
你用文本方式打開了二進制文件

文本方式讀取二進制數據, 可能在文件結束之前將某段數據判定為文件末尾EOF, 所以結束讀取( 舉個例子, 比如遇到 0x00 0x00 0xff 0xff, 則文本方式方式的文件流, 認為已經到文件末尾, 不能讀取)

你這個38016的文件, 大概在10k左右有段數據和文件結束標志格式相同, 文本方式讀取到10k左右就認為文件結束了( 真正的文本文件, 結束標志可能在磁碟簇的剩餘空間中 )

所以第一種方式:
固定讀取38016次, 每次往新文件中寫一個位元組; 前10k次能讀取到內容, fread返回值是1, 這樣寫過去的一位元組就是讀取的位元組; 後28k因為讀取失敗, fread返回值為0, 這樣temp的內容就不會被改寫, 仍然是最後一次成功讀取的值, 但因為是寫次數固定, 所以後28k就重復寫過去;
後一種方式:
根據fread的返回值來判定文件結束, 這是正確的方法; 所以讀取到10k後, 返回值為0, 表示無效, 文件結束, 所以只復制了10k內容

CFile只支持二進讀寫, 所以你的結果是正確的( CFile用CFile::typeText格式會報錯; CStdioFile才能文本讀寫)
用fopen返回的FILE, 如果讀取的時候沒有加b( 比如"r"), 則默認的是文本格式; 所以請用"rb"來讀取二進制文件, 用"wb"寫二進制文件; 當然如果只是復制文件的話, 純二進制讀寫沒有問題

下面是樓主要的效果, 是一個位元組讀寫的
#include <stdio.h>
int main()
{
FILE *pFileS = fopen( "s.rar", "rb" );
if( ! pFileS )
return 1;
FILE *pFileD = fopen( "d.rar", "wb+" );

unsigned char bTemp;
while( fread( &bTemp, sizeof(unsigned char), 1, pFileS) )
fwrite( &bTemp, sizeof(unsigned char), 1, pFileD );

fclose( pFileS ), fclose( pFileD );
return 0;
}
其實一個位元組讀寫的話, 用fgetc和fputc就可以了, 當然還是得以二進制方式打開

另外單位元組讀寫速度太慢; 系統中復制文件都是整塊讀寫的, 設置緩沖大小
比如
#include <stdio.h>
int main()
{
FILE *pFileS = fopen( "s.rar", "rb" );
if( ! pFileS )
return 1;
FILE *pFileD = fopen( "d.rar", "wb" );

unsigned char buffer[ 4 * 1024 ];
int nRead;
while( nRead = fread( buffer, sizeof(unsigned char), sizeof(buffer), pFileS ) )
fwrite( buffer, sizeof(unsigned char), nRead, pFileD );

fclose( pFileS ), fclose( pFileD );
return 0;
}

另外, fread單次讀取的總位元組數有限制, 也就是說緩沖有上限; 只能通過提高次數來讀取大文件; 在這方面, 用API如ReadFile或者調用了這些API的封裝類就好得多; 當然, 次數多對電腦來說不是問題呵呵

附:
至於文本方式不能完全讀取, 而二進制方式能的原因-
文本方式讀取文件, 最主要的用處是一次讀取一整句( 以換行符'\n', 即二進制的換行標志"\r\n"結束 ), 方便用於特殊用處ReadString、fscanf(...,"%s",...)之類, 每次讀取的內容長度是不定的; 而二進制讀取方式Read、fread等, 都是讀取固定長度
所以文本方式讀取對EOF的判定, 是一個文件尾結束標志, 如果是文本文件, 則這個文件尾肯定不會出現在文件內容中( 因為是不可列印字元構成的結束標志, 人可讀的文本文件不會包括它 ), 這樣以結束標志為文件尾則是可以的; 二進制文件內容可以是任意位元組, 如果把它當文本文件來讀, 以文件尾為結束, 當然可能出現把文件內容判定為文件尾的情況;
二進制讀取方式由於每次讀取固定位元組, 所以只需要用總文件長度( 這個數值是系統管理的數值, 不是計算得出來的 )減去每次讀取的長度( 或根據Seek的位置計算長度 ), 就可以知道是否到文件尾, 不需要定義結束標志; 所以用二進制方式打開任何文件都是合理的

閱讀全文

與fread大文件讀取相關的資料

熱點內容
編程怎麼做3d生存游戲 瀏覽:955
word使用教程下載 瀏覽:295
電腦文件平鋪圖片默認大小 瀏覽:115
文件查看設置信息失敗 瀏覽:668
編程如何編出烏鴉喝水的課文 瀏覽:20
國家反詐app報案助手怎麼使用 瀏覽:439
秘密文件丟失多少天 瀏覽:237
js中csstext 瀏覽:382
目標文件名過長復制 瀏覽:892
樂動力計步器老版本 瀏覽:933
壓縮文件鏈接怎麼編輯 瀏覽:808
如何鎖定PDF文件里的圖章 瀏覽:89
資料庫超時是什麼 瀏覽:649
文件怎麼改整列內容 瀏覽:764
360壓縮文件發郵件空白 瀏覽:813
上哪裡查自己大數據 瀏覽:907
編程語言怎麼學車 瀏覽:189
編程該怎麼學才能先找工作 瀏覽:524
文件刻制光碟多少錢 瀏覽:861
校園網的網路組成結構 瀏覽:862

友情鏈接