c语言中的IO操作
标准类型的输入输出:
- 输入------>数据来源是通过键盘进行输入
- 输出------>程序中的数据输出到控制台
c语言中:
-
scanf:输入
-
printf:输出
两个函数的相同点
1 —格式串
2 —不定参数
两个函数的缺陷
1 —用户要提供数据的格式—用户要记忆大量的格式串—而且容易出错
2 —两个函数参数检测不严格 -
getchar()
-
putchar()
-
gets()
-
puts()
文件类型的输入和输出
- 输出:数据从 文件中读取
- 输出:将程序中的数据输出到文件中
对输入输出缓冲区的理解:
1.可以屏蔽掉低级I/O的实现,低级I/O的实现依赖操作系统本身内核的实现,所以如果能够屏蔽这部分的差异,可以很容易写出可移植的程序。
2.可以使用这部分的内容实现“行”读取的行为,对于计算机而言是没有“行”这个概念,有了这部分,就可以定义“行”的概念,然后解析缓冲区的内容,返回一个“行”。
C++IO流
cerr和clog标准错误输出流,输出设备是显示器在流类库中,最重要的两部分功能为标准输入/输出
(standard input/output)和文件处理。在C++的流类库中定义了四个全局流对象:cin,cout,cerr和
clog
cin标准输入流对象,键盘为其对应的标准设备;cout标准输出流对象,显示器为标准设备。
在新库中要使用这四个功能,必须包含文件并引入std标准命名空间
为什么c++中cout和cin不需要格式串?
因为把所有的内置类型都进行了输出运算符的重载
注意
- cin为缓冲流。键盘输入的数据保存在缓冲区中,当要提取时,是从缓冲区中拿。如果一次输入过多,会留在那儿慢慢用,如果输入错了,必须在回车之前修改,如果回车键按下就无法挽回了。只有把输入缓冲区中的数据取完后,才要求输入新的数据。不可能用刷新来清除缓冲区,所以不能输错,也不能多输
- 输入的数据类型必须与要提取的数据类型一致,否则出错。出错只是在流的状态字state中对应位置位置,程序继续。
- 空格和回车都可以作为数据之间的分格符,所以多个数据可以在一行输入,也可以分行输入。但如果是字符型和字符串,则空格(ASCII码为32)无法用cin输入,字符串中也不能有空格。回车符也无法读入。
c语言中文件操作
文件分类
- 文本格式文件
- 二进制格式文件
按照文本方式写:
fwrite—>(buf,单个元素的字节,总共多少个元素,文件指针)
int a =12345678;
int b = atoi(str);//字符串转整型
char sz[32] = {0);
//整型转字符型
itoa(a,sz,10);//1.转换哪个变量 2.用谁来接收 3.转换成什么进制
//sz[]--->'1''2''3''4''5''6''7''8''\0'
//按二进制格式写入
fwrite(&a,sizeof(a),1,pf);//1.写入变量2.多大,3.写几个,4.朝哪个文件写
fwrite(sz,1,strlen(sz),pf);//按文本方式写
常用文件操作的函数
- fopen(“文件路径”,“文件的格式”)—>操作文件的格式
r 打开只读文件,该文件必须存在。
r+ 打开可读写的文件,该文件必须存在。
rb 打开一个二进制文件,只读。
rb+ 以读/写方式打开一个二进制文件。
w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
wb 打开一个二进制文件,只写。
wb+ 以读/写方式建立一个新的二进制文件。
a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。
a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。
ab 打开一个二进制文件,进行追加 。
ab+ 以读/写方式打开一个二进制文件进行追加 。
- fclose()
- fread()
- fwrite()
- fgetc()
- fputc()
- fgets()
- fputs()
更多详情请参考这里
如何检测一个文件是否读到结尾
检测文本文件格式可以,二进制文件不行
EOF是文件的结尾标记在 一个字节里保存了-1
,文件里的数据-1按照两个字节来进行存储,一个是符号一个是1。
while (EOF != (ch=fgetc()) )
c++中的文件操作
- 定义一个文件流对象
- ifstream ifile(只输入用)
- ofstream ofile(只输出用)
- fstream iofile(既输入又输出用)
- 使用文件流对象的成员函数打开一个磁盘文件,使得文件流对象和磁盘文件之间建立联系
- 使用提取和插入运算符对文件进行读写操作,或使用成员函数进行读写
- 关闭文件
#include<fstream>
// 使用文件IO流用文本及二进制方式演示读写配置文件
struct ServerInfo
{char _ip[32]; // ipint _port; // 端口
};struct ConfigManager
{
public:ConfigManager(const char* configfile = "bitserver.config"):_configfile(configfile){}void WriteBin(const ServerInfo& info){// 这里注意使用二进制方式打开写ofstream ofs(_configfile, ifstream::out | ifstream::binary);ofs.write((const char*)&info, sizeof(ServerInfo));ofs.close();}void ReadBin(ServerInfo& info){// 这里注意使用二进制方式打开读ifstream ifs(_configfile, ifstream::in | ifstream::binary);ifs.read((char*)&info, sizeof(ServerInfo));ifs.close();}void WriteText(const ServerInfo& info){// 这里会发现IO流写整形比C语言那套就简单多了,// C 语言得先把整形itoa再写ofstream ofs(_configfile);ofs << info._ip << endl;ofs << info._port << endl;ofs.close();}void ReadText(ServerInfo& info){// 这里会发现IO流读整形比C语言那套就简单多了,// C 语言得先读字符串,再atoiifstream ifs(_configfile);ifs >> info._ip;ifs >> info._port;ifs.close();}
private:string _configfile; // 配置文件
};int main()
{ConfigManager cfgMgr;ServerInfo wtinfo;ServerInfo rdinfo;strcpy(wtinfo._ip, "127.0.0.1");wtinfo._port = 80;// 二进制读写cfgMgr.WriteBin(wtinfo);cfgMgr.ReadBin(rdinfo);cout << rdinfo._ip << endl;cout << rdinfo._port << endl;// 文本读写cfgMgr.WriteText(wtinfo);cfgMgr.ReadText(rdinfo);cout << rdinfo._ip << endl;cout << rdinfo._port << endl;return 0;
}