目录
谢谢帅气美丽且优秀的你看完我的文章还要点赞、收藏加关注
没错,说的就是你,不用再怀疑!!!
希望我的文章内容能对你有帮助,一起努力吧!!!
·
1、标准IO的应用
1.1直接读写
想操作几个字符就操作几个字符
- fread 、 fwrite
fread 读取
fwrite 写入
#include <iostream>
int main()
{
FILE *file_ptr = fopen("1.txt","r+");
char buf[1024]={0};
/*
int fread(void *buf,int size,int nmenb,FILE *file)
{
int c = 0;
for(int count = 0;count < nmenb;count++)
{
if(size == read(file->fd,buf,size))
c++;
}
return c;
}
*/
fread(buf,2,5,file_ptr); // 从文件流file_ptr中读取2个字节,一共读取5次,存储到buf指向的空间中
std::cout << buf << std::endl;
fwrite("abcdef",2,3,file_ptr);
fclose(file_ptr);
return 0;
}
1.2冲洗一个文件流
冲洗流: fflush ,作用就是同步文件。(把缓冲区的内容同步硬件中)
标准IO是带缓冲的IO,读写操作是针对于缓冲区,并不是每次都是操作硬件。
有的时候多线程编程的时候会影响程序结果
#include <iostream>
#include <unistd.h>
int main()
{
int a,b;
scanf("%d%d",&a,&b);
std::cout << a << " " << b << std::endl;
fflush(NULL);
int c;
scanf("%d",&c);
std::cout << c << std::endl;
return 0;
}
1.3设置缓冲区
#include <iostream>
#include <cstring>
int main()
{
FILE * file_ptr = fopen("1.txt","w+");
// 用户自定义的缓冲区
char buf[1024]={0};
// 为stdout标准输出设置一个新的缓冲区
setvbuf(stdout,buf,_IOLBF,1024);
std::cout << "程序输出内容:123456789";
fwrite(buf,1,strlen(buf),file_ptr);
std::cout << std::endl;
return 0;
}
注意:函数 setvbuf 只能在一个流被开后,没有进行过任何操作之前使用。
1.4定位文件流
1.4.1设置光标位置
上面有提到 fread 和 fwrite ....只是说明要从哪个文件读写,读写多少个,并没有指明,从哪个位置开 始。标准IO会为每一个打开的文件流,保存一个“文件偏移量”
一般来说,每次读写之前,先确定 定位流(光标)。
fseek 就是用来定位文件流的光标的。
1.4.2获取光标位置
#include <iostream>
int main()
{
FILE * file = fopen("1.txt","r+");
fseek(file,10,SEEK_SET);
std::cout << ftell(file) << std::endl;
fclose(file);
return 0;
}
1.4.3重置光标位置
1.5文件出错/文件结束标志
EOF : End Of File 文件结束的标志
清除文件结束标志
标准IO库中,在读文件内容时候,如果读取到了末尾,会往缓冲区填入一个 EOF (二进制:1111 1111)
1.6格式化的输入输出
1.6.1格式化输入
scanf/sscanf/fscanf...
分为两类参数:
- 格式化字符串
- 告诉用户怎么输入,意思就是按我的格式规矩来输入
- 放在格式化字符串中的字符有三类:
- 非转义字符/普通字符
- A B C ... 1 2 3 ... // 必须要按原样输入,精准输入
- 格式化字符
- %d %s %c %f %o ....
- 转义字符
- \t \x89...
- 空白字符:
- \n \t \r ...
- 非转义字符/普通字符
- 参数
- 要与格式化字符的类型和数量相匹配
注意:格式化字符串中的每一个格式化字符,就对应一个地址,所以在输入的时候,参数要与格式化字 符的类型和数量相匹配,然后需要提供地址。
scanf 什么时候结束输入?
- scanf 从 stdin 的缓冲区中获取输入
- 当该输入的都输入完了。
- scanf("abcd%d %cbcd",&a,&c);
- abcd123Abcd
- 用户输入失败
- scanf(abcd%d %cbcd",&a,&c);
- ABCD // scanf就会停止匹配,结束
- 当该输入的都输入完了。
scanf返回成功匹配到的变量个数。
1.6.2格式化输出
#include <iostream>
int main()
{
FILE *f = fopen("2.txt","r+");
// //-----------------------------fscanf----------------------
// // 从一个文件流中以指定的格式获取数据
// int a,b,c;
// fscanf(f,"%d%d%d",&a,&b,&c); // "std::cin >> "abc" " std::cin >> a >> b >> c "std::cin >> "abc""
// std::cout << a << " " << b << " " << c << std::endl;
// //-----------------------------sscanf----------------------
// char buf[1024]={"123 45645 64564"};
// sscanf(buf,"%d%d%d",&a,&b,&c);
// std::cout << a << " " << b << " " << c << std::endl;
// //-----------------------------fprintf----------------------
// fprintf(f,"\n%d-%s-%d",123,"abcdefg",456);
/*
struct student
{
char name[1024];
int age;
char sex[5];
}s;
fscanf(f,"姓名:%s 年龄:%d 性别:%s",s.name,&s.age,s.sex);
std::cout << "姓名:" << s.name << "年龄:"<< s.age <<"性别:" << s.sex << std::endl;
fprintf(f,"\n姓名:%s 年龄:%d 性别:%s","张三",20,"男");
*/
//------------------------------sprintf---------------------
char buf[1024]={0};
sprintf(buf,"%s+%s=%s","123","456","789");
std::cout << buf << std::endl;
fclose(f);
return 0;
}
2、关于C++对于标准库的支持
#include<fstream>
ofstream //文件写操作 内存写入存储设备
ifstream //文件读操作,存储设备读区到内存中
fstream //读写操作,对打开的文件可进行读写操作
在 fstream 类中,成员函数 open() 实现打开文件的操作,从而将数据流和文件进行关联,通过 ofstream,ifstream,fstream 对象进行对文件的读写操作
打开方式
ios::in 为输入(读)而打开文件
ios::out 为输出(写)而打开文件
ios::ate 初始位置:文件尾
ios::app 所有输出附加在文件末尾
ios::trunc 如果文件已存在则先删除该文件
ios::binary 二进制方式
这些方式是能够进行组合使用的,以“或”运算(“|”)的方式