在学习这个知识点时,要清楚我们使用IO其实就是如何使用函数;
注意点
- 函数名
- 函数参数之间的关系
- 应用的场景,返回值
- 缓冲区的概念
1、IO的分类
- 文件IO
- 标准IO
重点
1、标准IO函数
fopen / fclose
fprintf / fscanf
fputc / fgetc
fputs / fgets
fwrite / fread
1.fprintf()的使用
//函数使用
#include<stdio.h>
#define MAX 50
int main(int argc, const char *argv[])
{
char buf[MAX];
scanf("%s",buf);
FILE *fp=fopen("1.txt","w");
//定义一个文件指针指向打开的文件,fopen打开文件返回这个打开文件的地址,w是只写的意思,会先清空文件然后在把数据写入打开的文件
fprintf(fp,"%s\n",buf);//这个函数的使用有三个参数,第一个参数是指向要写入的文件地址,第二个参数是写入的字符串格式,第三个参数是从程序的数组中当中写入,
fclose(fp);//关闭文件
return 0;
}
1.错误使用:
//函数使用
#include<stdio.h>
#define MAX 50
int main(int argc, const char *argv[])
{
char buf[MAX];
scanf("%s",buf);
FILE *fp=fopen("1.txt","w");
FILE *fp1=fopen("2.txt","r");
fprintf(fp,"%s\n",fp1);//第三个参数是一个文件指针,并不是传递数据的内容
fclose(fp);
fclose(fp1);
return 0;
}
2.实现将一个文件中的内容复制到另一个文件当中
#include <stdio.h>
#define MAX 50
int main(int argc, const char *argv[]) {
char buf[MAX];
// 打开文件 2.txt 进行读取
FILE *fp1 = fopen("2.txt", "r");
if (fp1 == NULL) {
perror("Error opening file 2.txt");
return 1;
}
// 打开文件 1.txt 进行写入
FILE *fp = fopen("1.txt", "w");
if (fp == NULL) {
perror("Error opening file 1.txt");
fclose(fp1);
return 1;
}
// 从 2.txt 读取内容并写入到 1.txt
while (fgets(buf, MAX, fp1) != NULL) //fgets()也是一个标准IO函数
{
fprintf(fp, "%s", buf);
}
// 关闭文件
fclose(fp);
fclose(fp1);
return 0;
}
需要记住,我们在使用fprintf()时,要注意参数,返回值,实现的功能,
fprintf()是将程序当中的数据,插入到文件当中,当然,我们之前使用printf()函数时,默认输出到终端是因为,终端也是一个文件。
在liunx下面有三个默认终端文件-——(终端文件是指我们使用的终端,也是一个文件)
1.stdin 标准输入 从终端文件输入到程序中
2.stdout 标准输出 从程序中输出到终端文件
3.stderr 标准错误输出 从程序中输出错误到终端文件,如果没错误,不输出
2.fscanf()的使用
#include<stdio.h>
#define MAX 50
int main(int argc, const char *argv[])
{
char buf[MAX];
FILE *fp=fopen("1.txt","r");//用一个文件指针指向打开的文件地址
fscanf(fp,"%s\n",buf);//从上面打开的文件读取数据到buf这个字符数组当中
puts(buf);//打印数组
fclose(fp);//关闭文件和起到刷新缓冲区的作用
return 0;
}
3.fgetc()和fputc()的使用
int fgetc(FILE *stream);
功能:从指定文件中获取单个字符
参数:
参数1:
FILE *stream:指定要从那个打开的文件中获取字符
返回值:
成功:返回获取到的字符ASCII
读取到文件末尾或失败,返回EOF
int fputc(int c, FILE *stream);
功能:向指定文件中输出单个字符
参数:
参数1:
int c:指定要输出写入到文件中的字符( c & 0xff )
参数2:
FILE *stream:流指针,表示打开的文件,要写入的文件
返回值:
成功,返回写入的字符
失败,返回EOF
#include<stdio.h>
int main(int argc, const char *argv[])
{
char c;
FILE *fp=fopen("1.txt","r");
while(1)
{
c=fgetc(fp);//返回值是文件中的字符
if(c==EOF)
{
break;
}
fputc(c,stdout);//将字符c的值输出到终端
}
fclose(fp);
return 0;
}
4.fputs()和fgets()的使用
使用方法和上面的字符输入输出大致一样,只是这里读取的是字符串而已
int fputs(const char *s, FILE *stream);
功能:输出写入字符串(不包括'\0')到指定文件
从程序中输出字符串到文件
参数:
参数1:
const char *s:字符串的首地址
参数2:
FILE *stream:指定要写入的文件,对应文件的流指针
返回值:
成功,返回非负整数
失败,返回EOF
char *fgets(char *s, int size, FILE *stream);
功能:从指定文件中读取字符串 从文件中读取数据到程序当中
注意:fgets在读取时,会在读取的内容后自动补上一位'\0'字符,确保拿出来的数据是字符串
参数:
参数1:
char *s:输入读取文件的内容存储的内存地址
参数2:
int size:指定要获取的字符的个数,最多只能获取size-1个字符,在读取的末尾添加'\0'
获取的大小:
1、遇到 \n 就会停止本次读取,会获取到\n字符
2、遇到 文件结尾,就会停止
3、其他情况都读取size-1个字符
参数3:
FILE *stream:要读取的文件
返回值:
成功,返回 s 的地址
文件读取完毕或者失败,返回NULL
#include<stdio.h>
int main(int argc, const char *argv[])
{
char buf[50];
FILE *fp=fopen("1.txt","r");//打开文件
while(1)
{
if(fgets(buf,3,fp)==NULL)//从文件中读取数据到程序
{
break;
}
puts(buf);从程序输出数据到文件,默认输出到终端文件
}
fclose(fp);//关闭文件
return 0;
}
5.fread()和fwrite()的使用
size_t fwrite(const void *ptr, size_t size, size_t nmemb,
FILE *stream);
功能:将指定数据写入到指定文件中,由nmemb项数据组成,每项数据有size个字节,写入到文件
参数:
参数1:
const void *ptr:要输出/写入到文件的数据的首地址,void * 可以表示任意类型的数据
参数2:
size_t size:每项数据的大小
参数3:
size_t nmemb:共输出写入多少项数据
参数4:
FILE *stream:输出写入的文件
返回值:
成功,返回写入的数据项数,不是字节数
失败,返回小于指定要写入的数据项数,或者返回0
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:从文件中读取指定个数,指定大小的数据
参数:
参数1:
void *ptr:指定将读取的数据存储的内存地址
参数2:
size_t size:每个数据的大小
参数3:
size_t nmemb:要读取多少个数据
参数4:
FILE *stream:读取的文件
返回值:
成功,返回读取的数据个数,注意,在读取时,返回值的个数才表示具体读取到的个数
文件读取完毕或者失败,会返回小于指定大小的个数,或者等于0(已经在文件末尾,没有读取到任何数据)
总结
本文主要重点讲了标准的IO函数,关于缓冲区只需要了解是一个存放待刷新数据的地方就可以了,否则会难以理解