免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3732 | 回复: 6

[C] 如何在文件中保存数据的同时保存时间信息 [复制链接]

论坛徽章:
0
发表于 2010-01-19 17:04 |显示全部楼层
20可用积分
因为需要记录数据的发生时刻,所以在保存到文件中的时候要打上时间标签,请问这个怎么做啊?

最佳答案

查看完整内容

char *data="2222222222222";my_data.data_=data; fwrite(&my_data,sizeof(my_data),1,fp);你 printf一下sizeof(my_data)看看,存的实际长度根不是你要的长度void *data_; 只是一个指针上面的结构要添充 int data_len 数据的长度, fwrite 的时候要把实际有效的长度写上=============补上我测度的代码读的结果[ 本帖最后由 axlrose 于 2010-1-19 18:08 编辑 ]

论坛徽章:
0
发表于 2010-01-19 17:04 |显示全部楼层
char *data="2222222222222";
my_data.data_=data;  
fwrite(&my_data,sizeof(my_data),1,fp);

你 printf一下sizeof(my_data)看看,存的实际长度根不是你要的长度
void *data_; 只是一个指针

上面的结构要添充  int data_len 数据的长度, fwrite 的时候要把实际有效的长度写上



=============
补上我测度的代码



  1. $ cat main.c
  2. #include <glib.h>
  3. #include <time.h>
  4. #include <unistd.h>
  5. #include <stdio.h>
  6. #include <string.h>

  7. typedef struct _data {
  8.     int data_len;
  9.     time_t timestamp_;
  10.     void *data_;
  11. }data_t;

  12. int main()
  13. {
  14.     data_t my_data;
  15.     FILE *fp;
  16.     char *data="2222222222222";

  17.     time_t timep;
  18.     time(&timep);      

  19.     my_data.timestamp_=timep;
  20.     my_data.data_ = data;
  21.     my_data.data_len = strlen(my_data.data_);
  22.     g_printf("data_len = %d\n",  my_data.data_len );
  23.     fp = fopen("./temp","wb");
  24.     fwrite(&my_data.data_len, sizeof(int), 1, fp);
  25.     fwrite(&my_data.timestamp_, sizeof(time_t), 1, fp);
  26.     fwrite(my_data.data_, my_data.data_len, 1, fp);
  27.     fclose(fp);
  28.     return 0;
  29. }
复制代码


  1. $ cat read.c
  2. #include <glib.h>
  3. #include <time.h>
  4. #include <unistd.h>
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <string.h>

  8. typedef struct _data {
  9.     int data_len;
  10.     time_t timestamp_;
  11.     void *data_;
  12. }data_t;

  13. int main()
  14. {
  15.     data_t my_data;
  16.     FILE *fp;
  17.    

  18.     time_t timep;
  19.     time(&timep);      

  20.     my_data.timestamp_=timep;
  21.     my_data.data_ = NULL;
  22.     my_data.data_len = strlen(my_data.data_) + sizeof(int) + sizeof(time_t);
  23.     fp = fopen("./temp","rb");
  24.     fread(&my_data.data_len, sizeof(int), 1, fp);
  25.     g_printf("data_len = %d\r\n", my_data.data_len);
  26.     my_data.data_ = malloc(my_data.data_len);
  27.     fread(&my_data.timestamp_, sizeof(time_t), 1, fp);
  28.     fread(my_data.data_ , my_data.data_len, 1, fp);
  29.     g_printf("data_ = %s\r\n",  my_data.data_ );
  30.     free(my_data.data_ );
  31.     fclose(fp);
  32.     return 0;
  33. }


复制代码


  1. ] $ cat Makefile
  2. all:test read_time
  3. test:main.c
  4.         $(CC) -o $@  $(shell pkg-config --cflags --libs glib-2.0 gthread-2.0) $^
  5. read_time:read.c
  6.         $(CC) -o $@  $(shell pkg-config --cflags --libs glib-2.0 gthread-2.0) $^

  7. clean:
  8.         -rm -f *.o test

复制代码


读的结果

  1. $ ./read_time
  2. data_len = 13
  3. data_ = 2222222222222

复制代码

[ 本帖最后由 axlrose 于 2010-1-19 18:08 编辑 ]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2010-01-19 17:06 |显示全部楼层
struct  data
{
      int data_len_;
      time_t timestamp_;
      void *data_;
};
你把这个结构体写进去不就行了,更新的时候直接 seek到 timestamp_位置,重新写一次就OK了

论坛徽章:
0
发表于 2010-01-19 17:25 |显示全部楼层
多谢指点,可是我不会用啊。
下面是我的程序,您帮忙看看

struct data
{
        int data_len;
        time_t timestamp_;
        void *data_;
};

void main()
{
        struct data my_data;
        FILE *fp;
        char *data="2222222222222";
       
        time_t timep;
        time(&timep);       
       
        my_data.timestamp_=timep;
        my_data.data_=data;
       
        fp=fopen("/tmp/temp2","wb");
       
        fwrite(&my_data,sizeof(my_data),1,fp);

        fclose(fp);
}

能存数据,但不是我要存的内容。

论坛徽章:
0
发表于 2010-01-19 17:45 |显示全部楼层
sizeof(my_data)的长度是12,应该只是structure的大小
但是fwrite应该可以这样写的

另外对于这个结构应该怎么用呢?里面的指针是干什么用的呢?
struct data
{
        int data_len;
        time_t timestamp_;
        void *data_;
};

多谢

论坛徽章:
0
发表于 2010-01-19 18:02 |显示全部楼层

  1. typedef struct _data {
  2.     int data_len;
  3.     time_t timestamp_;
  4.     void *data_;
  5. }data_t;
复制代码


要不换成以下这样,把定长与变长部分的数据分离, fread(xxx, 定长长度, )
读出来后再根据data_len 再分配内存读取变长数据内容

  1. typedef struct _data_header {
  2.     int data_len;
  3.     time_t timestamp_;
  4. }data_header_t;

  5. typedef struct _data {
  6.      data_header_t data_header;
  7.      void *data_;
  8. }data_t;
复制代码


写入的时候先添充好data_header_t的信息,一次性写入 fwrite(xxx, sizeof(data_header_t),再写入 data_ 的数据
读取的时候先fread   sizeof(data_header_t) ,  就知道后面还有多少数据了,紧跟着再读 data_ 的数据
主要就是靠 data_len了

[ 本帖最后由 axlrose 于 2010-1-19 18:08 编辑 ]

论坛徽章:
0
发表于 2010-01-19 18:39 |显示全部楼层
补上一贴的代码


  1. $ cat Makefile
  2. all:write_data read_data
  3. read_data:read_data.c
  4.         $(CC) -o $@  $(shell pkg-config --cflags --libs glib-2.0 gthread-2.0) $^
  5. write_data:write_data.c
  6.         $(CC) -o $@  $(shell pkg-config --cflags --libs glib-2.0 gthread-2.0) $^

  7. clean:
  8.         -rm -f *.o write_data temp read_data


  9. #-----------------end Makefile ----------

  10. $ cat mytype.h
  11. #ifndef __MY_TYPE_H
  12. #define __MY_TYPE_H

  13. #include <time.h>

  14. typedef struct _data_header {
  15.     int data_len;
  16.     time_t timestamp_;
  17. }data_header_t;

  18. typedef struct _data {
  19.     data_header_t data_hader;
  20.     char *data_;
  21. }data_t;

  22. #endif

  23. //-------------end mytype.h--------------

  24. $ cat read_data.c
  25. #include <glib.h>
  26. #include <time.h>
  27. #include <unistd.h>
  28. #include <stdio.h>
  29. #include <stdlib.h>
  30. #include <string.h>
  31. #include "mytype.h"


  32. int main()
  33. {
  34.     data_t my_data;
  35.     FILE *fp;

  36.     fp = fopen("./temp","rb");
  37.     fread(&my_data.data_hader, sizeof(data_header_t), 1, fp);

  38.     g_printf("data_len = %d\r\n", my_data.data_hader.data_len );
  39.     g_printf("time = %s", asctime(localtime(&my_data.data_hader.timestamp_)));
  40.     my_data.data_ = malloc(my_data.data_hader.data_len + 1);
  41.     fread(my_data.data_ , my_data.data_hader.data_len, 1, fp);
  42.     my_data.data_[my_data.data_hader.data_len] = '\0';
  43.     g_printf("data_ = %s\r\n",  my_data.data_ );
  44.     free(my_data.data_);
  45.     fclose(fp);
  46.     return 0;
  47. }


  48. //-------------------------end read_data.c ------------

  49. $ cat write_data.c
  50. #include <glib.h>
  51. #include <unistd.h>
  52. #include <stdio.h>
  53. #include <string.h>
  54. #include "mytype.h"



  55. int main()
  56. {
  57.     data_t my_data;
  58.     FILE *fp;
  59.     char *data="1234567890";

  60.     time_t timep;
  61.     time(&timep);      

  62.     my_data.data_hader.timestamp_ = timep;
  63.     my_data.data_hader.data_len = strlen(my_data.data_);
  64.     my_data.data_ = data;

  65.     g_printf("data_len = %d\n",  my_data.data_hader.data_len );
  66.     g_printf("time = %s", asctime(localtime(&timep)));
  67.     g_printf("data_ = %s\n",  my_data.data_);
  68.     fp = fopen("./temp","wb");
  69.     fwrite(&my_data.data_hader, sizeof(data_header_t), 1, fp);
  70.     fwrite(my_data.data_, my_data.data_hader.data_len, 1, fp);
  71.     fclose(fp);
  72.     return 0;
  73. }


  74. //------------------------end write_data.c ------------

复制代码


测试结果

  1. $ ./write_data
  2. data_len = 11
  3. time = Tue Jan 19 18:38:41 2010
  4. data_ = 1234567890
  5. [arch@] $ ./read_data
  6. data_len = 11
  7. time = Tue Jan 19 18:38:41 2010
  8. data_ = 1234567890
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会,8.5折限时优惠重磅来袭!
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。

限时8.5折扣期:2019年9月30日前


----------------------------------------

大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP