不應(yīng)對(duì)非文本文件使用fgetc等易受干擾的函數(shù),建議用fread,fwrite讀寫(xiě)二進(jìn)制文件

創(chuàng)新互聯(lián)建站專業(yè)為企業(yè)提供恒山網(wǎng)站建設(shè)、恒山做網(wǎng)站、恒山網(wǎng)站設(shè)計(jì)、恒山網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、恒山企業(yè)網(wǎng)站模板建站服務(wù),十年恒山做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
#include "stdio.h"
/* 保護(hù)硬盤,絕對(duì)不要一個(gè)字節(jié)一個(gè)字節(jié)復(fù)制 */
#define SIZEOFBUFFER 256*1024L /* 緩沖區(qū)大小,默認(rèn)為256KB */
long filesize(FILE *stream)
{
long curpos, length;
curpos = ftell(stream);
fseek(stream, 0L, SEEK_END);
length = ftell(stream);
fseek(stream, curpos, SEEK_SET);
return length;
}
int copyfile(const char* src,const char* dest)
{
FILE *fp1,*fp2;
int fsize,factread;
static unsigned char buffer[SIZEOFBUFFER];
fp1=fopen(src,"rb");
fp2=fopen(dest,"wb+");
if (!fp1 || !fp2) return 0;
for (fsize=filesize(fp1);fsize0;fsize-=SIZEOFBUFFER)
{
factread=fread(buffer,1,SIZEOFBUFFER,fp1);
fwrite(buffer,factread,1,fp2);
}
fclose(fp1);
fclose(fp2);
return 1;
}
int main()
{
copyfile("file1.txt","file2.txt");
return 0;
}
#includestdio.h
#includestdlib.h
int main(int argc, char *argv[])
{
// char s1[100],s2[100];
FILE *p1,*p2;
char ch;
if(argc!=3)
{
printf("ming ling cuowu!");
exit(1);
}
if(argc==3)
{
p1=fopen(argv[1],"r");
p2=fopen(argv[2],"w");
if(p1==NULL||p2==NULL)
{
printf("wenjian bu cunzai!");
exit(1);
}
ch=fgetc(p1);
while(ch!=EOF)
{
fputc(ch,p2);
ch=fgetc(p1);
}
printf("kaobei chenggong!");
}
return 0;
}
要用命令行的模式執(zhí)行程序
可以加我百度
以二進(jìn)制打開(kāi)源文件進(jìn)行讀取(二進(jìn)制可以拷貝任何文件),以二進(jìn)制打開(kāi)目標(biāo)文件進(jìn)行寫(xiě)入,讀取源文件的一個(gè)字符,如果feof()表明已經(jīng)到達(dá)文件末尾,如果沒(méi)有到達(dá)源文件末尾,則將該字符寫(xiě)入目標(biāo)文件。loop...
int file_copy(char *oldname, char *newname)
//接收文件名為輸入,把oldname文件拷貝到newname
{ FILE *fold, *fnew;
int c;
//打開(kāi)源文件
if ((fold = fopen(oldname, "rb")) == NULL)
return -1;
//打開(kāi)目標(biāo)文件
if ((fnew = fopen(newname, "wb")) == NULL)
{ fclose(fold); //如果目標(biāo)文件空,關(guān)閉并返回
return -1;}
while (1)
{ c= fgetc(fold);
if (!feof(fold))
fputc(c, fnew);
else
break;
}
fclose(fold);
fclose(fnew);
}
C語(yǔ)言復(fù)制文件主要由三種辦法,你可以根據(jù)自己的知識(shí)選用一個(gè)
方法1)利用C語(yǔ)言的二進(jìn)制讀寫(xiě)函數(shù)
自己用fopen打開(kāi)源文件和目標(biāo)文件,然后用循環(huán)讀寫(xiě)實(shí)現(xiàn)復(fù)制
方法2)利用操作系統(tǒng)的文件復(fù)制函數(shù)
例如Windows就有如下API函數(shù)可以復(fù)制文件
BOOL CopyFile(
LPCTSTR lpExistingFileName, // name of an existing file
LPCTSTR lpNewFileName, // name of new file
BOOL bFailIfExists // operation if file exists
);
第一個(gè)參數(shù)是用來(lái)存放當(dāng)前要處理文件的路徑。
第二個(gè)參數(shù)是用來(lái)存放用戶指定的新路徑。
第三個(gè)參數(shù)它是用來(lái)判斷用戶指定的新路徑是否已經(jīng)存在要存放的路徑,如果為TRUE,則新路徑中已經(jīng)存在該文件了,該函數(shù)調(diào)用失敗,否則就調(diào)用成功。
方法3:C語(yǔ)言調(diào)用操作系統(tǒng)的copy命令
首先#includestdlib.h
然后 程序中 調(diào)用 system(“這里寫(xiě) copy的完整命令”);
首先是使用庫(kù)函數(shù)
比如下面代碼
void ourStrCopy(char S1[] , char S2[]){ strcpy(S1, S2); //該函數(shù)還有另一個(gè)版本可以按長(zhǎng)度截取 }
還有一個(gè)函數(shù)是memcpy,這個(gè)是內(nèi)存拷貝,原型是
void memcpy(void *dest, const void *src, size_t n); 需要注意的是這個(gè)函數(shù)第一個(gè)和第二個(gè)指針都是void型且第二個(gè)指針不能被修改,第三個(gè)參數(shù)是需要拷貝的內(nèi)存長(zhǎng)度按字節(jié)記。
然后是用指針引用,注意這個(gè)并非賦值,而是引用,這種操作需要注意內(nèi)存。
char s1[] = "abcdefg";//定義一組字符串char *s2 = s1;//按照指針拷貝字符串
第三種方法就是直接賦值了
void outStrCopy(char s1[] , char s2[]){ int len1 = strlen(s1);//獲取第一個(gè)字符串的長(zhǎng)度 int len2 = strlen(s2);//獲取第二個(gè)字符串的長(zhǎng)度 int len = 0; //字符串總長(zhǎng)度 if(len1 = len2){ len = len2; //選擇COPY的長(zhǎng)度 }else{ len = len1; } for(int i = 0 ; i len ; i++){ s1[i] = s2[i]; //實(shí)現(xiàn)數(shù)據(jù)拷貝 }}
這樣寫(xiě)就行了:
#includestdio.h
void main()
{
char pBuffer[8];
FILE *f1, *f2;
f1 = fopen("file1", "rb"); // 以二進(jìn)制形式讀,file1是文件名
f2 = fopen("file2", "wb"); // 以二進(jìn)制形式寫(xiě),file2是文件名
while (!feof(f1))
{
fread(pBuffer, 1, 8, f1); // 每次讀8個(gè)字節(jié)
fwrite(pBuffer, 1, 8, f2); // 每次寫(xiě)8個(gè)字節(jié)
}
fclose(f1);
fclose(f2);
}
網(wǎng)頁(yè)名稱:c語(yǔ)言實(shí)現(xiàn)文件拷貝函數(shù),c++復(fù)制文件函數(shù)
當(dāng)前網(wǎng)址:http://chinadenli.net/article39/dsepeph.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航、品牌網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、微信公眾號(hào)、域名注冊(cè)、企業(yè)網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)