c - 日志文件作为列表?

标签 c list logging

对于一个项目,我必须完成教科书提供的日志模板。

提供的代码如下:

#include <time.h>
typedef struct data_struct {
  time_t time;
  char *string;
} data_t;

int addmsg(data_t data);
void clearlog(void);
char *getlog(void);
int savelog(char *filename);

//
#include <stdlib.h>
#include <string.h>
#include "log.h"

typedef struct list_struct {
  data_t item;
  struct list_struct *next;
} log_t;

static log_t *headptr = NULL;
static log_t *tailptr = NULL;

int addmsg(data_t data) {
  return 0;
}

void clearlog(void) {
}

char *getlog(void) {
  return NULL;
}

int savelog(char *filename) {
  return 0;
}

现在,我想我能够做到 addmsgclearlog ,但我缺少 getlogsavelog .

这两个函数的说明是:

The getlog function allocates enough space for a string containing the entire log, copies the log into this string, and returns a pointer to the string. It is the responsibility of the calling program to free this memory when necessary. A successful getlog call returns a pointer to the log string. An unsuccessful getlog call returns NULL.

The savelog function saves the logged messages to a disk file. If successful, savelog return 0, otherwise return -1.

These functions also set errno on failure.

到目前为止,我所要做的只是尝试确定日志的大小,

int logsize = sizeof(log_t) + 1;

我真的不知道该去哪里。任何帮助将不胜感激。

编辑:

对于addmsg ,我们得到了一个具有类似功能的程序,当我适应这个程序时,我最终得到了

int addmsg(data_t data) {
  log_t *newnode;
  int nodesize;
  nodesize = siezeof(log_t) + strlen(data.string) + 1;
  if ((newnode = (log_t *)(malloc(nodesize))) == NULL //can't add
    return -1; //add failed
  newnode->item.time = date.time;
  newnode->item.string = (char *)newnode + sizeof(log_t);
  strcpy(newnode->item.string, data.string);
  newnode->next = NULL;
  if (headptr == NULL)
    headptr = newnode;
  else
    tailptr->next = newnode;
  tailptr = newnode;
  return 0;
}

如果它像迭代文件一样简单,我就不会有问题。我只是不习惯处理节点和指针。我不知道如何迭代这些(因为添加消息时它们不会自动放入文件中)以查找字符串长度并为 getlog 分配适当的内存。 .

对于clearlog :

void clearlog(void) {
  static log_t *current = *headptr;
  static log_t *next;
  while (current != NULL) {
    next = current->next;
    free(current);
    current = next;
  }
  *headptr = NULL;
}

这会迭代消息,但我不知道如何实现它来复制每个节点中的字符串 getlog .

最佳答案

这并不是提出此类问题的正确地点。您基本上是在要求我们做您的作业。

不过,你的作业问题可以分为两个主要部分

  • 如何写入文件
  • 如何从数据结构中获取字符串形式的日志,并根据需要分配内存

写入文件很容易,这个问题以前已经被问过很多次了。最好的资源是标准库文档,您可以在这里找到此类资源 http://www.tutorialspoint.com/c_standard_library/c_function_fprintf.htm

出于这个问题的目的,我将复制突出的示例,该示例应该足以简单地保存文件:

#include <stdio.h>
#include <stdlib.h>

int main()
{
   FILE * fp;

   fp = fopen ("file.txt", "w+");
   fprintf(fp, "%s %s %s %d", "We", "are", "in", 2012);

   fclose(fp);

   return(0);
}

打开文件,写入内容,关闭文件,就完成了。

现在是问题的另一部分,关于为日志字符串分配足够的内存。

我首先会问一个问题,他们想要一个包含所有日志文件的字符串,还是只包含最后一个日志文件?每个解决方案都非常不同。

我首先说这段代码: int logsize = sizeof(log_t) + 1; 是错的。它获取 log_t 结构的大小 + 1,这是不正确的。您想要最终字符串的大小。这个 log_t 结构实际上是 data_t 结构的大小,加上一个指向 data_t 的指针。 data_t 的大小是 time_t 的大小加上一个字符指针。

首先问问自己日志条目会是什么样子。数据结构是一个字符串、日志消息以及一个 time_t 实体。 time_t 的长度是多少?这实际上取决于您如何格式化它。字符串的长度是多少?好吧,你不知道,你需要另一个函数来告诉你这一点。

单个日志消息的大小为: strlen(logMessage) + strlen(格式(时间))

其中 format() 是一个适当格式化时间的函数。然后,您需要递归所有日志条目,将每个日志条目的长度相加。请务必在内存中添加日志行条目之间的换行符,然后添加最后的空字符。

这应该足以帮助您入门。

关于c - 日志文件作为列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39377379/

相关文章:

c - 如何在一个语句中重新定义一个数组?

java - 将关联的字符(来自 ASCII)放入对象类型列表中

c++ - 如何使 HTML5 文件变大?

tomcat - tomcat 日志中 SLF4JBridgeHandler 中的处理程序错误

c - 无法将 linux 程序的输出存储到文件中

c - printf和co如何区分float和double

list - Sencha Touch 2 列表背景改变

java - 在 SLF4j 中更改 Java 日志输出文件的名称

C:从文件中获取以特定字符开头的随机字符串

c# - 在 List<entity> 中搜索具有类属性匹配值的记录?