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:用文件指针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)