学习自李慧琴老师
实验1:fgets 正常结束情况说明
实验2:以字符串拷贝的方式实现cp, fgets(),fputs()
1 fgets说明
/*
读取文件后的存储地址
读取大小
源文件
*/
char *fgets(char *s, int size, FILE *stream);
返回值:
fgets() returns s on success, and NULL on error or when end of file occurs while no characters have been read.
成功返回s地址,失败或者读完 返回空指针。
注意区分 fget() 返回值 成功为字符整形值,失败为 EOF
两种可能造成该函数的正常结束
情况1,读到了 size-1 个有效字节,为什么只读取SIZE-1个字节,因为读取的是一个字符串。所以最后剩下一个字节位是要存 ‘\0’ 的。
情况2,遇到 ‘\n’换行符, '\n’表示当前字符串的结束
实验1:fgets 正常结束情况说明
#define SIZE 5
char buf[SIZE];
char *fgets(buf, SIZE, stream);
情况1,如果文件中的内容是 abcdef,那么第一次读取的时候,那5个字节的空间中存储的分别是 a b c d \0,读完后当前文件的当前位置指针是在e这个位置处。
情况2,如果文件中的内容是 ab, 对该文件进行读取的话,读完ab 之后, 其实后面还有一个字符‘\n’,也会被读取。 所以对该文件读取之后,buf 中存储的内容就是 a b \n \0,其中\0是自动补的。
注意:当我们vim 打开一个空文档时候,只要进入编辑模式,即使没有输入,但是其实该空文档也是有一个字符的,该字符就是第一行默认的‘\n’换行符。即使是文件最后一行的内容,结尾也有 ‘\n’换行符。
情况3:擦边球情况
如果文件中的内容是 abcd,如果用上面fgets()读取,需要读几次才能读取完该文件 ,需要读两次。
第一次 -> a b c d ‘\0’,读到了 SIZE-1个字符
第二次 -> ‘\n’ ‘\0’
2 fputs说明
int fputs(const char *s, FILE *stream);
DESCRIPTION
fputs() writes the string s to stream, without its terminating null byte (’\0’).
实验2 以字符串拷贝的方式实现cp, fgets(),fputs()
#include<stdio.h>
#include<stdlib.h>
#define BUFSIZE 1024
int main(int argc,char *argv[])
//int main(int argc,char **argv)
{
FILE *fps,*fpd;
char buf[BUFSIZE];
if(argc < 3)
{
fprintf(stderr,"Usage:%s <src_file> <dest_file>\n",argv[0]);
exit(1);
}
fps = fopen(argv[1],"r");
if(fps == NULL)
{
perror("fopen()");
exit(1);
}
fpd = fopen(argv[2],"w");
if(fpd == NULL)
{
fclose(fps);
perror("fopen()");
exit(1);
}
while(fgets(buf,BUFSIZE,fps) != NULL)
{
fputs(buf,fpd);
}
fclose(fpd);
fclose(fps);
}
mhr@ubuntu:~/work/linux/stdio/mycpy_fgets$
mhr@ubuntu:~/work/linux/stdio/mycpy_fgets$
mhr@ubuntu:~/work/linux/stdio/mycpy_fgets$ gcc mycpy_fgets.c
mhr@ubuntu:~/work/linux/stdio/mycpy_fgets$ ll
total 28
drwxrwxr-x 2 mhr mhr 4096 Apr 19 06:55 ./
drwxrwxr-x 4 mhr mhr 4096 Apr 19 06:45 ../
-rwxrwxr-x 1 mhr mhr 9024 Apr 19 06:55 a.out*
-rw-rw-r-- 1 mhr mhr 531 Apr 19 06:55 mycpy_fgets.c
-rw-rw-r-- 1 mhr mhr 11 Apr 19 03:36 test1
-rw-rw-r-- 1 mhr mhr 0 Apr 19 06:45 test2
mhr@ubuntu:~/work/linux/stdio/mycpy_fgets$ ./a.out test1 test2
mhr@ubuntu:~/work/linux/stdio/mycpy_fgets$ ll
total 32
drwxrwxr-x 2 mhr mhr 4096 Apr 19 06:55 ./
drwxrwxr-x 4 mhr mhr 4096 Apr 19 06:45 ../
-rwxrwxr-x 1 mhr mhr 9024 Apr 19 06:55 a.out*
-rw-rw-r-- 1 mhr mhr 531 Apr 19 06:55 mycpy_fgets.c
-rw-rw-r-- 1 mhr mhr 11 Apr 19 03:36 test1
-rw-rw-r-- 1 mhr mhr 11 Apr 19 06:55 test2
mhr@ubuntu:~/work/linux/stdio/mycpy_fgets$