#include <fstream> #include <iostream> using namespace std;
void main() { // C++ STREAM -------------- ofstream ostream("a", ios::out); ostream << "a" << endl << "abc" << endl << "c" << " "; // 不要以ends间隔,否则读取失败 ostream << 10; // 此时10尚在缓冲区,并未真正写到文件,若立刻读取文件数据会读不到他 ostream.flush(); // flush将缓冲区数据写入文件,如果调用close同样会flush,写入一个endl也可(等同put("/n") + flush())
ifstream istream("a", ios::in); char buffer[10]; istream >> buffer; cout << buffer << endl; istream >> buffer; cout << buffer << endl; istream >> buffer; cout << buffer << endl; int ia; istream >> ia; cout << ia << endl;
// C FILE ------------- FILE* fb = fopen("b", "wb"); fwrite("ab/nc", sizeof("ab/nc"), 1, fb); // 写入 'a''b''/n''c''0'
FILE* fc = fopen("c", "w"); int a = 10; fwrite(&a, sizeof(a), 1, fc); // 写入四字节0x 0A 000000
FILE* fd = fopen("d", "wb"); fprintf(fd, "a"); // 写入 'a''/0'; fprintf(fd, "/n"); // 写入 '/n'
// fstream的读写方式总是将字符串转换为去掉eos的字符序列,将数值转换为字符列写入。读出时各数据比如以endl(/n)或空格或eof相隔,注意不要以ends相隔。 // 其binary模式只是会将(endl, /n)在windows上转化为(/r/n).
// 如果未设置binary, 换行符(/n, 0A )将按照所在操作系统的文件格式扩展(这里也只有Windows的Dos文件格式会要扩展为(/r/n, 0D 0A ) ) // 反之若设置binary, 换行符(/n, 0A )将不会扩展, 此时若以windos记事本(将所有字节以字符形式呈现的程序)打开该文件, 0A 会被视作普通字符(呈现为黑色方块)而不会换行, 此时可利用UltraEdit将其转化为DOS文件格式, 或者用写字板(他会自动将/n识别作/r/n)亦可打开 // 所以仅从文件外观是无法判断该文件是DOS文件格式还是UNIX文件格式, 这也说明即便在Windows上也有UNIX文件存在, UNIX上也会有DOS文件存在。
// 字符串在有无设置binary模式的状况相同, 均作为字符序列写入文件(eos, /0, 00被忽略, 除非手工写入ends). // 数值在有无设置binary模式的状况也相同, 具备转换为字符序列写入文件,比如10将转换为'1','0'写入文件.
// 由上可以看出fstream比之传统的FILE有一些不同 // 1. fstream比较适合读写文本文件,即所有数据均被作为字符写入或读出 // 2. 传统的C FILE总是工作在二进制下, 即所有数据均以原始字节呈现,比如int 10就被写入为0x 0A 000000(intel - ledian - byte - order, 如果是bigedian则为0x 0000000A ),而字符串则被写入为非带eos的字符序列(要读出带eos的字符串则必须以空格或换行间隔,这点同 ifstream),换行符/n在windows下也不会扩展。 // - 注意C FILE被打开时的模式字"b"可有可无, 该字只是为了与ISO C兼容而已。 // - fwrite(const void*, size_t size, size_t count, FILE*); size - 每次读写字节数, count - 读写多少次 // - fread(void*, size_t size, size_t count, FILE*); 同上 // 3. FILE要实现fstream的字符序列读写功能则以fscanf, fprintf来实现
// 综合上述, 我们应该在以文本形式读写时选择fstream,而在二进制读写时选择FILE.
system("pause"); }