- 按行存储把每个单元的数据格式化为一行(末尾加上\n),写入文件。例如,保存ip和port
char ip[]=”192.168.1.100″;
int port = 8080;char line[256];
sprintf(line, “ip=%s\n”, ip);
fwrite(line, 1, strlen(line), fp);sprintf(line, “port=%d\n”, port);
fwrite(line, 1, strlen(line), fp);
- 也可以直接使用fprintf函数char ip[]=”192.168.1.100″;
int port = 8080;fprintf (fp, “ip=%s\n”, ip);
fprintf (fp, “port=%d\n”, port);fprintf:第一个参数是文件指针,后面的参数和printf,直接将数据格式化成字符串并写入文件。 - 按行解析解析时复杂度相对较高
(1) 按行读取,每次读取一行。
由于不知道每行是多长,所以用fread读取时,需要检测是否已经读到了 \n这个分隔符。(有点复杂)推荐使用fgets函数,这个函数已经把上面的逻辑给封装好了。fgets内部会检查,当读到字符\n时,停止读取。返回实际读取的字节长度。
(2) 对读取到的每一行进行解析(参考15.3讲的解析方法)
char buf[512]; while(! feof(fp)) { char* line = fgets(buf, 512, fp); if(line) { printf("got: %s", line); } }
注: line末尾有一个\n字符
保存结构体时,可以把结构体的数据格式化为一行。例如, struct Student { int id; // id char gender; // 性别 char name[16]; // 年龄 }; Student someone = { 20150101, 'M' , "Noname" }; fprintf("id=%d,gender=%c,name=%s\n", someone.id, someone.gender, someone.name);
保存结构体时,可以把结构体的数据格式化为一行。例如, struct Student { int id; // id char gender; // 性别 char name[16]; // 年龄 }; Student someone = { 20150101, 'M' , "Noname" }; fprintf("id=%d,gender=%c,name=%s\n", someone.id, someone.gender, someone.name);
按行解析一行,一般用sscanf是无法胜任的。 比如, char line[] = "id=123,name=shaofa,hometown=anhui"; int id; char name[32]; char hometown[32]; sscanf(line, "id=%d,name=%s, hometown=%s", &id, name, hometown); sscanf只适合提取数字,不能提取字符串!