一、fgetc函数和fputc函数
(1)fgetc
fgetc是C语言标准库中的一个函数,用于从文件中逐个读取字符。它接受一个文件指针作为参数,并返回已读取字符的编码(整数值),或者返回 EOF
表示文件末尾或发生了错误。
函数原型为:
int fgetc(FILE *stream);
参数说明:
- FILE *stream:指向要读取字符的文件的指针
- int :返回值类型,如果成功读取到字符,则返回对应的字符编码(整数值);如果已到达文件末尾或发生了错误,则返回 EOF(通常被定义为
-1
)。
注意:fgetc()函数返回一个整数值,而不是字符本身,原因是它可以返回所有可能的字符,包括正常的字符和特殊字符,如换行符、制表符等等。
(2)fputc函数
fputc函数也是C语言标准库中的一个函数,用来将字符写入到程序中,它接受一个字符和一个文件指针作为参数,并返回已写入的字符(整数值),或者返回 EOF
表示发生了错误。
函数原型为:
int fputc(int c, FILE *stream);
参数说明:
- int c :要写入的字符,通过ASCII码转化为字符
- FILE *stream:指向要写入字符的文件的指针。
- int :返回值类型,如果成功写入字符,则返回写入的字符(整数值);如果发生了错误,则返回 EOF
。
注意: fputc函数接受的字符参数是一个整数值。这是因为它可以用于写入任意字符,包括正常的字符和特殊字符。如果传递给fputc函数的字符值超出了可表示范围,那么函数可能会发生未定义的行为。
(3)应用
通过fputc和fgetc函数,我们可以实现向文件中写入数据和读取数据,基于此,我们可以封装一个函数用来实现文件的拷贝。代码如下:
int MyFilecp(const char *filename_scr, const char *filename_dst)
{
FILE *fp1;
FILE *fp2;
char c;
fp1 = fopen(filename_scr,"r");
if(NULL == fp1)
{
perror("fail to open filename_scr");
return -1;
}
fp2 = fopen(filename_dst,"w");
if(NULL == fp2)
{
perror("fail to open filename_dst");
return -2;
}
while(1)
{
c = fgetc(fp1);
if(c == EOF)
{
break;
}
fputc(c,fp2);
}
fclose(fp1);
fclose(fp2);
return 0;
}
二、fgets函数和fputs函数
(1)fgets函数
fgets函数数是C语言标准库(stdio.h)中的一个输入函数,用于从文件或标准输入流读取一行文本(遇到‘\n’会立即停止)。函数原型为:
char *fgets(char *s, int size, FILE *stream);
参数说明:
- char *s :指向一个字符数组的指针,用于存储读取到的字符串。
- size:最大读取字符数(包括换行符和空字符),不一定会读满size个字符,遇到'\n'会立刻停止,不再读取。
- stream :指向FILE对象的指针,表示要从哪个文件流中读取数据。
- char * :返回值类型,如果成功读取到了字符串,则返回指向该字符串首地址的指针;如果遇到了文件结束符(EOF),则返回 NULL;如果发生了错误,也返回 NULL,并且可以通过检查
feof
或ferror
来确定是遇到了文件结束还是发生了错误。
注意:fgets函数会读取每一行文本,包括换行符 \n,并将其存储在 str
指向的字符数组中,直到达到最大读取字符数 n
或者遇到换行符或文件结束符为止。如果所读取的行长度超过了 n-1
,那么剩余的字符会被截断并丢弃。所以,使用 fgets()
函数可以安全地读取文本行,避免缓冲区溢出,并且保留换行符。但需要注意的是,fgets()
函数每次只能读取一行文本,不能逐个读取字符或单词。fgets()会在读取到的文本末端自动添加'\0'。
(2)fputs函数
fputs()
函数是C语言标准库(stdio.h)中的一个输出函数,用于将一个字符串写入到文件或标准输出流。函数原型为:
int fputs(const char *s, FILE *stream);
参数说明:
- const char *str :要写入的字符串首地址。
- stream:指向 FILE 对象的指针,表示要写入数据的文件流
- int :返回值类型,如果成功写入字符串,则返回非负值,如果发生错误,则返回
EOF
。
注意:fputs函数写入的操作不会自动添加换行符,所以如果需要换行,需要在字符串末尾显式添加换行符 \n
。
(3)应用
编写程序实现利用fgets和fputs实现文件内容拷贝。
#include<stdio.h>
int myFileCp(const char *filenameScr,const char *filenameDst)
{
FILE *fpscr;
FILE *fpdst;
char line[1024];
char *c;
fpscr = fopen(filenameScr, "r");
fpdst = fopen(filenameDst, "w");
if (NULL == fpscr)
{
perror("fail to open scr");
return -1;
}
if (NULL == fpdst)
{
perror("fail to open dst");
return -2;
}
while(1)
{
c = fgets(line,sizeof(line),fpscr);
if (NULL == c)
{
break;
}
fputs(line, fpdst);
}
fclose(fpscr);
fclose(fpdst);
}
int main(void)
{
char src[128];
char dst[128];
scanf("%s", src);
scanf("%s", dst);
myFileCp(src, dst);
return 0;
}