C/C++文件读写

IO类:
  1. iostream类: 负责与控制台输入输出打交道, 又可以区分为istream和ostream
  2. fstream类: 负责与文件输入输出打交道, 又可以区分为:ifstream和ofstream
  3. stringstream类:负责与string上的输入输出打交道
    fstream 中seekg和seekp是联动的,移动读指针,写指针随之移动,移动写指针,读指针也会随之移动。
    fstream继承自ifstream和ofstream是他们俩的子类 ,而seekp和tellp是ofstream的成员函数,seekg和tellg是ifstream的成员函数,seekp是指seek put,seekg是指seek get。之所以在fstream中他们相同,是因为这里指定打开方式 in | out。但是读写模式不能创建不存在的新文件,只读模式才能创建文件

fprintf是C/C++中的一个格式化写-库函数,写的是数字转换成ASCII码之后的字符,其作用是格式输出到一个流/文件中;原型是int fprintf( FILE *stream, const char *format, [ argument ]…)

//打开文件
FILE* fp = fopen(obj_file_name.c_str(), "w");

fprintf(stderr, "IOError: %s could not be opened...\n",
			obj_file_name.c_str());

//格式化输出
fprintf(fp, "v %.15f %.15f %.15f\n", v[0], v[1], v[2]);

fwrite是不加转换的直接写入。用fwrite 写入文件的如果是能够表示为字符,那么就会显示为字符,如果显示不出来,那就写的是二进制内容(所谓的乱码)

//打开文件流
std::ofstream file(obj_file_name.c_str(), std::ios::binary);

//写整数
file.write((char*)&v_num,sizeof(int));

//写数据块(struct)
file.write((char*)&verticesData[i], sizeof(Point3D));

//写char数组
file.write(mtl_file_name.c_str(), sizeof(char)*(strlen(mtl_file_name.c_str()) + 1));

如果要让生成的文件自己可以看得懂,那么就选择fprintf,如果想看不懂,那就用fwrite,两者只是写入方式不同,生成的文件倒都是计算机可读的

C和C++风格的文件读写

C:用文件指针File,可以打开中文路径

/* 
//    params:
//    @s:buffer
//    @size:buffer大小,每次最大读入字节数
//    @fp:文件指针
*/
char *fgets(char *s, int size, FILE *stream);

c++:ifstream/ofstream,工程属性中字符集类型设置为UNICODE时可以打开中文路径,MULTIBYTE时不能打开中文路径(或者需要设置locale)

/*
    //params:
    //@is:输入流
    //@str:buffer
    //@delim:终止符,遇到该字符停止读取,默认为回车
*/
//头文件为
 istream& getline ( istream &is , string &str , char delim );

将整个文件读入内存,然后用指针访问数据,减少IO次数:

std::ifstream file(fileName.c_str(), std::ios::binary);
	//get file length
	file.seekg(0, std::ios::end);
	int fileLength = file.tellg();
	file.seekg(0, std::ios::beg);
//将文件读入内存
char* buffer = new char[fileLength];
file.read(buffer, fileLength);
file.close();

//用指针访问buffer中的数据
char* fp=buffer;
//读取字符串
int mtlFileLen = strlen(fp) + 1;
char* mtlFileName = new char[mtlFileLen];
memcpy(mtlFileName, fp, mtlFileLen);
fp += mtlFileLen;

//读取数组
double* vertices = new double[v_num * 3];
 memcpy(vertices, fp, sizeof(double) * 3 * v_num);
 fp += sizeof(double) * 3 * v_num;

ref:
https://www.cnblogs.com/hhddcpp/p/4303572.html
【fopen/open、fwrite/write、fwrite/write的区别】(https://blog.csdn.net/iva_brother/article/details/78974826)

你可能感兴趣的:(C++)