一、函数
char *fgets(char *s, int size, FILE *stream);
功能:从stream文件期望读取size个字符,保存在s内
返回:成功为s(缓存的首地址),文件结尾或者出错返回NULL。
注意:1、至多读取size-1个字符
2、遇到‘\n’或‘EOF’停止读取,并且换行符也会被读取
3、读取的末尾自动加‘\0’字符
int fputs(const char *s, FILE *stream);
功能:将s字符串写到stream文件内
返回:失败返回EOF(-1)
注意:遇到‘\0’字符结束输出
二、测试源码
#include <stdio.h>
#define N 5
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];
while(fgets(buf, N, fp_r) != NULL)
{
//printf("buf = %s\n",buf);
fputs(buf, fp_w);
}
printf("copy ok\n");
fclose(fp_r);
fclose(fp_w);
return 0;
}
三、测试结果
四、关键代码分析
while(fgets(buf, N, fp_r) != NULL)
{
// printf("buf = %s\n",buf);
fputs(buf, fp_w);
}
每次读取N个到buf中,然后使用fputs函数将buf中的内容写入到待拷贝的文件中。
结束标志为读到文件的末尾。
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int my_fputs(void)
{
int i = 0;
FILE *fp = NULL;
char *filename = "./a.txt";
char a[27]= "abcdefghijklmn";
fp = fopen(filename, "w+"); //w+ 读写,创建,清空模式
if (fp == NULL)
{
printf("func fopen() err!\n");
return -1;
}
printf("打开成功\n");
/*
for (i=0; i<strlen(a); i++)
{
fputc(a[i], fp);
}
*/
fputs(a, fp);
if(NULL != fp)
fclose(fp);
return 0;
}
int my_fgets(void)
{
int i = 0;
FILE *fp = NULL;
char *filename = "./a.txt";
char buf[1024];
fp = fopen(filename, "r+"); //读和写方式
if (fp == NULL)
{
printf("func fopen() err!\n");
return -1;
}
printf("打开成功\n");
//C 函数库 会 一行一行的copy数据 到buf指针所指的内存空间中 并且变成C风格的字符串
//把\n也copy到我们的buf中
//内存打包 (把内存首地址 + 内存的长度)
while (!feof(fp))
{
char *p = fgets(buf, 1024, fp);
if (p == NULL)
{
goto End;
}
printf("%s", buf);
}
End:
if (fp != NULL)
{
fclose(fp);
}
return 0;
}
int main(int argc, const char * argv[])
{
my_fputs();
my_fgets();
return 0;
}