文件读写
文件操作可分为文本文件、二进制文件读写
1.C语言读写
1.1读文本文件
int a; cha b[]=......
fopen("fileName, "r");
fscanf(filePtr, "%s,%d\n", a,b);
or fgets(...)
写文本文件
float c = ....
fopen(..........)
fprintf(filePtr, "\n%s, %d, %3.1f\n",b, a, c); %3.1f指保留三位有效数字,小数点保留一位,格式化为字符输出到文件
1.2读二进制
fopen(fileName, "rb");
fread(...........)
写二进制
fopen(fileName, "wb");
fwrite(...........)
fread函数返回直接读取的字节数,对于C++的read函数则返回ifstream的引用,要获取其实际读取的字节数用gcount函数
2.C++读写
good():检查是否打开,成功打开return TRUE
eof():是否到文件末尾,若到文件末尾retur TREUE
2.1读文本文件
ifstream fcin(fileName, ios::in); 用 ios_base::in也可以,ios::in是继承自ios_base::in
getline(fcin, str.....)
or fcin.getline(......)
or get(fcin.......)
or fcin.get(....)
or fcin >>
写文本文件
ofstream fcout(fileName, ios::out); 用ios_base::out一样,ios是从ios_base派生出来的
fcout <<
2.2读二进制文件
ifstream fcin(fileName, ios::in || ios::binary)
fcin.read(.....)
写二进制文件
ofstream fout(fileName, ios::out || ios::binary)
fout.write(....)
3.MFC读写
例子直接参考:https://blog.youkuaiyun.com/phenixyf/article/details/42917191
参数参考:https://blog.youkuaiyun.com/kaida1234/article/details/51148700
注意:
对于字符来说,其二进制表示与文本表示是一样的,对于数字来说,其二进制表示与文本表示存在很大差异;字符、数字都是存储其二进制,字符的二进制为其对应的ASCLL对应的值,数字的二进制就是其直接转为二进制的值。
对于以文本模式、二进制模式的输出,本质都是输出字符、数字对应的二进制,区别仅仅在于文本模式会将\n输出为\n与\r的组合,而二进制模式严格按照二进制输出,所以对于文本输出、二进制输出关键在于其文本、二进制模式的选择,与函数无关,所以有的函数既可以输出文本形式文件,又可以输出二进制文件。比如write函数既可以在文本模式下输出(会将\n输出为\n\r),又可以在二进制模式下输出。(注意fprintf就只能在文本模式下输出,因为其是先格式化为文本后输出)
举例说明1:
C++的函数write(),二进制模式输出可以这样:(read函数与write函数对应,也可以在文本模式、二进制模式下使用,具体可见primer plus文件读写部分)
ofstream fcout(filePath, ios_base::out | ios_base::binary);
int x[3] {1, 2, 3};
fcout.write((char*)x, sizeof(int) * 3);
文本模式可以这样:
ofstream fcout(filePath, ios_base::out);
char x[3] {'a', '\n', 'b'};
fcout.write(x, sizeof(char) * 3);
举例说明2:
C++文件输出的<<运算在文本输出模式下很好用,其后边可以直接跟float、int、double数字的类型,其会将他们转为对应的字符的ASCLL,最后将他们输出到文件。
ofstream fcout(filePath, ios_base::out);
char a[] = "abcdef";
int b = 1; int c = 2;
fcout << a << b << c;
举例说明3:
文本输出模式下,可以将int、float、double数字类型格式化到字符串中,输出这些字符串,就完成了对数字的文本化输出(同理可以想到>>在读取中的应用)
char a[100];
int n = 1;
sprintf(a, "n的值为%d", n);
fcout << a;
有关sprintf函数的格式化符号可见:http://www.runoob.com/cprogramming/c-function-sprintf.html
输出的格式控制
对输出的格式控制主要分为三种方法:控制符(也可作为函数使用,但不是成员函数)、set函数(也是成员函数)、其他成员函数,set函数功能最全,但是较为繁琐,部分可以用控制符代替。
以下为一些控制符与set函数的对照,节选自primer plus p751
还有setw、setpresicion、setfill控制符;fill()、precision()、width()成员函数也可以设置格式
例1:
fcout << hex 或 hex(fcout);
fcout.setf(ios_base::hex, ios_base::basefied);
例2:
fcout << setw(20); 或 setw(fcout)
fcout.width()
小数存放方式有浮点数(默认)、定点、科学计数法,默认的浮点计数精度指其总共位数,在定点、科学计数法下指其小数位数;
设置例子:
setf():
fcout.setf(ios_base::fixed, ios_base::floatfied); fcout.presicion(3);
控制符:
fcout << fixed << setprecision(3);
设置浮点没有专门的字段,可以通过以下:
fcout.set(0, ios_base::floatfied);
或 fcout.unsetf(ios_base::floatfied)
或在fixed下 fcout.unsetf(ios_base::fixed);
或在scientific下 fcout.unsetf(ios_base::scientific)
C++中一些常用的流格式控制符汇总:https://blog.youkuaiyun.com/qq_30062589/article/details/54835894