目录
前言
实际上标准IO是调用系统IO的,就比如说在linux系统里面我们使用fopen这个函数,会发现实际上是调用封装在fopen函数里面的open函数。
本篇文章会讲解:fopen fclose fgetc fputc fgets fputs fscanf fprintf fread fwrite fseek ftell rewind函数,这些函数的头文件:stdio.h
fopen
函数的原型:FILE *fopen(const char *path, const char *mode);
功能:打开一个文件
函数的参数:
path:要打开的文件的路径(绝对、相对)
mode:这个简单来说就是,r是读文件,w写文件,a追加文件。r的时候必须要有文件才能读;w的时候是有文件就先把文件清空在写数据,没有文件就是先创建在写数据;a是在文件尾追加数据;可以这样理解,要是w不清空数据直接写那不就没有a的事情了吗;类似r+这里的这个+号,则是可以读写操作;rb这类的b就是以二进制的形式。大家理解一下就应该能记住了。
注:打开绝对路径里面的斜杠要两条-> FILE *pf = fopen("D:\\tmp\\test.c", "r");
函数返回值:
成功返回 文件指针 FILE * 类型的
失败返回 NULL
fclose
函数的原型:int fclose(FILE *stream);
功能:关闭文件描述符
fgetc
函数的原型:int fgetc (FILE *fp);
功能:获取一个字符
eg:
FILE* pf = fopen("text.txt", "r");
int ch = fgetc(pf);//这里fgetc的返回值是int类型的。
printf("%c", ch);
fputc
函数原型:int fputc ( int ch, FILE *fp );
功能:向文件中写一个字符
eg:
FILE* pf = fopen("text.txt", "w");
fputc('a', pf);
fclose(pf);
![](https://i-blog.csdnimg.cn/blog_migrate/aa9edbb491391d78da442998ff724b62.png)
fgets
函数头文件:stdio.h
函数的原型:char *fgets(char *s, int size, FILE *stream);
函数的参数:
s : 这是指向一个字符数组的指针,该数组存储了要读取的字符串。
size :这是要读取的最大字符数(包括最后的空字符)。通常是使用以 str 传递的数组长度。
stream :这是指向 FILE 对象的指针,该 FILE 对象标识了要从中读取字符的流。
函数返回值:
函数成功:返回读取的首地址。如果到达文件末尾或者没有读取到任何字符,str的内容保持不变,并返回一个空指针。
失败返回NULL
描述:
从指定的流stream读取一行,并把它存储在str所指向的字符串内。当读取(n-1)个字符时,或者读取到换行符时,或者到达文件末尾时,它会停止,具体视情况而定。
eg:
int main()
{
FILE* fd = fopen("text.txt", "r+");
if (fd == NULL)
{
printf("open failed!");
return 0;
}
char line[256];
fgets(line, sizeof(line), fd);/*从fd文件指针中读取字节
读完这一行(\n)或者255字节(256字节补\0)或者到EOP*/
printf("%s", line);
printf("****************************\n");
fgets(line, sizeof(line), fd);
printf("%s", line);
return 1;
}
![](https://i-blog.csdnimg.cn/blog_migrate/21834c1d1e2ac784dee37ec16fb67147.png)
fputs
函数的功能:往文件输入/写入字符串(写文件 按照行来写,想要换行就要在代码里面加\n)
函数头文件:stdio.h
函数的原型:int fputs(char * str, FILE *stream);
函数的参数:
char *str 就是你要写入的字符串
FILE *stream :就是文件句柄
函数返回值:
该函数返回一个非负值,如果发生错误则返回 EOF。
eg:
int main()
{
FILE* fd = fopen("text.txt", "a+");
if (fd == NULL)
{
printf("open failed!");
return 0;
}
char line[256] = "\nApril 19th";
fputs(line, fd);
return 1;
}
![](https://i-blog.csdnimg.cn/blog_migrate/14e3c5c92c0f960768caeb0002fdb406.png)
fscanf
函数的功能:读取格式化输入。
函数头文件:stdio.h
函数的原型:int fscanf(FILE *stream, const char *format, ...)
函数的参数:
FILE *stream :就是文件句柄
函数返回值:
该函数返回一个非负值,如果发生错误则返回 EOF。
int main()
{
FILE* fd = fopen("text.txt", "r+");
if (fd == NULL)
{
printf("open failed!");
return 0;
}
char str1[256], str2[256], str3[256], str4[256];
fscanf(fd, "%s %s %s %s", str1, str2, str3, str4);
printf("%s %s\n", str1, str2);
printf("%s %s", str3, str4);
return 1;
}
![](https://i-blog.csdnimg.cn/blog_migrate/8dcfe9333c05520417c65581a55ec660.png)
fprintf
函数的功能:格式化输出。
函数头文件:stdio.h
函数的原型:int fprintf(FILE *stream, const char *format, ...)
函数的参数:
FILE *stream :就是文件句柄
format : 这是 C 字符串,包含了要被写入到流 stream 中的文本。它可以包含嵌入的 format 标签,format 标签可被随后的附加参数中指定的值替换,并按需求进行格式化。
函数返回值:
该函数返回一个非负值,如果发生错误则返回 EOF。
int main()
{
FILE* fd = fopen("text.txt", "w+");
if (fd == NULL)
{
printf("open failed!");
fclose(fd);
return 0;
}
fprintf(fd, "%s %s %s %s", "hello", "world", "april", "19th");
fprintf(fd, "%s %s %s %s", "hello", "world", "april", "19th");
fclose(fd);
return 1;
}
![](https://i-blog.csdnimg.cn/blog_migrate/e83decce22f4835e8c622e2bc521fc01.png)
注:需要手动添加\n进行换行。
fread
函数的功能:从文件中读取一片内容
函数头文件:stdio.h
函数的原型:size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
函数的参数:
ptr:传入一个空间
size:这是要读取的每个元素的大小,以字节为单位。
nmemb: 这是元素的个数,每个元素的大小为 size 字节。
stream:文件句柄
函数返回值:
size_t :读取的次数
int main()
{
FILE* fd = fopen("text.txt", "r+");
if (fd == NULL)
{
printf("open failed!");
fclose(fd);
return 0;
}
char buff[20] = "";
fread(buff, sizeof(buff), 1, fd);
printf("%s", buff);
fclose(fd);
return 1;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6e542f7fbabc1a7c89a8f2b3e18be285.png)
fwirte
函数的功能:写入一个缓冲区给文件
函数头文件:stdio.h
函数的原型:
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
函数的参数:
ptr: 这是指向要被写入的元素数组的指针。
size:这是要被写入的每个元素的大小,以字节为单位。
nmemb:这是元素的个数,每个元素的大小为 size 字节。
stream:这是指向 FILE 对象的指针,该 FILE 对象指定了一个输出流。
函数返回值:
返回你成功写入的次数
int main()
{
FILE* fd = fopen("text.txt", "w+");
if (fd == NULL)
{
printf("open failed!");
fclose(fd);
return 0;
}
char buff[20] = "i eat apple";
fwrite(buff, sizeof(buff), 1, fd);
fclose(fd);
return 1;
}
![](https://i-blog.csdnimg.cn/blog_migrate/28d62138a505f6da0157d6b29ec88e77.png)
fseek
函数头文件:stdio.h
函数功能:设置流 stream 的文件位置为给定的偏移 offset,参数 offset 意味着从给定的 whence 位置查找的字节数。
函数的原型:int fseek(FILE * stream,long offset,int whence);
函数的参数:
stream:文件句柄
offset:为根据参数 whence 来移动读写位置的位移数(负数就是向前移,整数就是向后移)
whence:
SEEK_SET: 从距文件开头offset位移量为新的读写位置
SEEK_CUR: 以目前的读写位置往后增加offset个位移量
SEEK_END :将读写位置指向文件尾后再增加offset个位移量
函数返回值:
调用成功时则返回 0
若有错误则返回-1
注意:
1.必须使用 ftell()来取得目前读写的位置。
2.当 whence 值为 SEEK_CUR 或 SEEK_END 时,参数 offset 允许负值的出现
int main()
{
FILE* fd = fopen("text.txt", "w+");
if (fd == NULL)
{
printf("open failed!");
fclose(fd);
return 0;
}
char buff[20] = "i like eat apple";
fwrite(buff, strlen(buff), 1, fd);//这里应该打印i like eat apple
fseek(fd, -5, SEEK_CUR);//这里的意思是,当前文件指针的位置向前移五个字节。
fwrite("banana", strlen("banana"), 1, fd);
fclose(fd);
return 1;
}
![](https://i-blog.csdnimg.cn/blog_migrate/43a1f068eda314db1398da8a822d75e1.png)
ftell
函数功能:查找当前文件指针的位置
函数原型:long int ftell(FILE *stream);
返回值:该函数返回位置标识符的当前值。如果发生错误,则返回 -1L,全局变量 errno 被设置为一个正值。
int main()
{
FILE* fd = fopen("text.txt", "w+");
if (fd == NULL)
{
printf("open failed!");
fclose(fd);
return 0;
}
char buff[20] = "i like eat apple";
fwrite(buff, strlen(buff), 1, fd);
fseek(fd, -5, SEEK_CUR);
int num = strlen("i like eat ");//我们预期让文件指针移动到的位置,有空格!
int addr = ftell(fd);//计算此时文件指针的位置
printf("now addr is %d, num is %d\n", addr, num);
fwrite("banana", strlen("banana"), 1, fd);
fclose(fd);
return 1;
}
![](https://i-blog.csdnimg.cn/blog_migrate/70047fbb9894b43ada6a08b5392c9576.png)
rewind
函数功能:让文件指针的位置回到起始位置
函数原型:void rewind(FILE *stream);
int main()
{
FILE* fd = fopen("text.txt", "w+");
if (fd == NULL)
{
printf("open failed!");
fclose(fd);
return 0;
}
char buff[20] = "i like eat apple";
fwrite(buff, strlen(buff), 1, fd);
fseek(fd, -5, SEEK_CUR);
rewind(fd);
fwrite("banana", strlen("banana"), 1, fd);
fclose(fd);
return 1;
}
![](https://i-blog.csdnimg.cn/blog_migrate/63a572b01f89ad953c038544c924b109.png)
完结!!