一、函数
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:从stream文件中读取nmemb项数据存到ptr,每一项数据size大小
返回:读取成功的完整项数,读到EOF或失败返回0
注意:size使用单位字节大小
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *st);
功能:将ptr里的数据写nmemb项到stream文件中,每项size大小
返回:写入成功的完整项数
二、测试源码
#include <stdio.h>
#define N 32
int main(int argc, const char *argv[])
{
if(argc < 3)
{
printf("argument is too less\n");
return -1;
}
FILE *fp_r = fopen(argv[1], "r");
if(fp_r == NULL)
{
printf("fp_r fopen error\n");
return -1;
}
FILE *fp_w = fopen(argv[2], "w");
if(fp_w == NULL)
{
printf("fp_w fopen error\n");
return -1;
}
char buf[N];
int ret = 0;
while((ret = fread(buf, 1, N, fp_r)) != 0)
{
fwrite(buf, 1, ret, fp_w);
}
printf("copy ok\n");
fclose(fp_r);
fclose(fp_w);
return 0;
}
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 1024 * 4 //每次读写4k数据
void menu()
{
printf("================================\n");
printf("1 拷贝文件\n");
printf("2 清屏\n");
printf("3 退出\n");
printf("================================\n");
}
void myCopy()
{
char rPath[256]; //源文件
char wPath[256]; //目的文件
FILE *rFp = NULL;
FILE *wFp = NULL;
char buf[SIZE] = { 0 };
int n = 0;
printf("请输入源文件:");
scanf("%s", rPath);
printf("请输入目的文件:");
scanf("%s", wPath);
if (strcmp(rPath, wPath) == 0)
{
printf("源文件和目的文件不能相同\n");
return;
}
//只读方式打开源文件
rFp = fopen(rPath, "rb");
if (rFp == NULL)
{
perror("fopen rPath");
return;
}
//只写方式打开目的文件
wFp = fopen(wPath, "wb");
if (wFp == NULL)
{
fclose(rFp);
perror("fopen wFp");
return;
}
do
{
n = 0;
//读多少,写多少
n = fread(buf, sizeof(char), SIZE, rFp);
printf("拷贝:%d\n", n);
fwrite(buf, sizeof(char), n, wFp);
} while (n > 0);
printf("拷贝完成\n\n");
fclose(rFp);
fclose(wFp);
}
int main()
{
int cmd;
while (1)
{
menu();
printf("cmd: ");
scanf("%d", &cmd);
switch (cmd)
{
case 1:
myCopy();
break;
case 2:
system("clear");
break;
default:
exit(0);
}
}
return 0;
}
三、测试结果
四、关键代码分析
while((ret = fread(buf, 1, N, fp_r)) != 0)
{
fwrite(buf, 1, ret, fp_w);
}
当返回值不是0时,将每次读取到的数据块通过buf拷贝至待拷贝的文件中,直到读到文件的末尾。
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
//直接把内存数据 写入到 文件中
typedef struct Teacher
{
char name[64];
int age ;
}Teacher;
int my_fwrite(void)
{
int i = 0;
FILE *fp = NULL;
char *fileName = "./a.data";
Teacher tArray[3];
int myN = 0;
for (i=0; i<3; i++)
{
sprintf(tArray[i].name, "%d%d%d", i+1, i+1, i+1);
tArray[i].age = i + 31;
}
fp = fopen(fileName, "wb");
if (fp == NULL)
{
printf("建立文件失败\n");
return -1;
}
for (i=0; i<3; i++)
{
myN = fwrite( &tArray[i],sizeof(Teacher) , 1, fp);
}
if (fp != NULL)
{
fclose(fp);
}
return 0;
}
int my_fread(void)
{
int i = 0;
FILE *fp = NULL;
char *fileName = "./a.data";
Teacher tArray[3];
int myN = 0;
fp = fopen(fileName, "rb");
if (fp == NULL)
{
printf("建立文件失败\n");
return -1;
}
for (i=0; i<3; i++)
{
myN = fread(&tArray[i], sizeof(Teacher), 1, fp);
}
for (i=0; i<3; i++)
{
printf("name:%s, age:%d \n", tArray[i].name, tArray[i].age);
}
if (fp != NULL)
{
fclose(fp);
}
return 0;
}
int main(int argc, const char * argv [])
{
my_fwrite();
my_fread();
return 0;
}