[语法]以文本形式存储

  • 按行存储把每个单元的数据格式化为一行(末尾加上\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只适合提取数字,不能提取字符串!

 

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注