对于一个项目,我必须完成教科书提供的日志模板。
提供的代码如下:
#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;
}
现在,我想我能够做到 addmsg
和clearlog
,但我缺少 getlog
和savelog
.
这两个函数的说明是:
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 successfulgetlog
call returns a pointer to the log string. An unsuccessfulgetlog
call returnsNULL
.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/