1.我常用的读写文件函数总结
fopen:打开文件
FILE *fopen( const char * filename, const char * mode );
在vs中使用fopen时会报一个错误,因为高版的VS默认不让使用scanf,fopen等函数,说是scanf,fopen等函数不安全,而代替其函数的是scanf_s,fopen_s等函数,后边有个"_s"的形式。
使用字符串相关函数strcpy等也会出现上述问题。
解决方法:
可以在属性——c/c++——预处理器——预处理器定义中添加 _CRT_SECURE_NO_WARNINGS
或者定义宏
#define _CRT_SECURE_NO_WARNINGS
fclose:关闭文件
fprintf:按照参数中指定的格式写入文件中,与printf类似,只不过printf是打在控制台命令行中,fprintf是写入文件中。
fscanf:按照参数中指定的格式从文件中读出数据。
fwrite:按照数据在内存中存储的顺序依次写入文件,每个数据的大小,写入数据的个数在函数参数中都有规定。
fread: 按照数据在文件中存储的形式读出,放到指针指向的内存中,每个数据的大小,写入数据的个数在函数参数中都有规定。
2.指向数组的指针作为出参传入函数时,必须预先分配内存并初始化,否则得不到想要的数据。
当外层函数不知道分配多少内存时,可以传递指针的指针,如下例子所示:
void fun(int**my_data){
//注意这里并不是想将my_data作为二维数组使用,而是作为指针的指针
//这里是因为主函数不知道分配多大内存,子函数中才知道,所以放在子函数中分配了
int data_num=10;
*my_data=(int*)malloc(sizeof(int)*data_num);
for(int i=0;i<data_num;i++){
*my_data[i]=i;
}
}
int main(void){
int * data=NULL;
fun(&data);
//使用data数据
//释放data数据
free(data);
}
3.通过程序依次读写某文件夹中的文件时,可这样处理:
//定义文件名中固定的字符串
char *img_path = "D:/work/shanghai-widefiled-project/data/sea/";
char*img_format = ".bmp";
//依次读取10幅图像
for(int img_index=0;img_index<10;img_index++)
char img_name[100];
strcpy(img_name, img_path);
//将数字转换为字符,sprintf与printf用法类似,只是将内容按照格式写入字符串中
char img_id[5];
sprintf(img_id,"%d",img_index);
strcat(img_name, img_id);
strcat(img_name, img_format);
C语言中处理字符串没有python那么简单,但C语言中也提供了一些处理字符串的重用的函数,如下表所示: