对于项目,我必须完成教科书提供的日志模板。
提供的代码如下:
#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
。
这两个功能的说明如下:
getlog
函数为包含整个日志的字符串分配足够的空间,将日志复制到此字符串中,并返回指向字符串的指针。调用程序负责在必要时释放此内存。成功的getlog
调用返回指向日志字符串的指针。失败的getlog
调用会返回NULL
。
savelog
函数将记录的消息保存到磁盘文件中。如果成功,savelog
返回0,否则返回-1。这些功能也会在失败时设置
errno
。
到目前为止,我只想用
来确定日志的大小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
的每个节点中的字符串。
答案 0 :(得分:1)
这不是提出这种性质问题的正确场所。你基本上要求我们做你的功课。
你的作业问题可以分为两个主要部分,但
写入文件很容易,之前已经多次询问过这个问题。最好的资源是标准库文档,您可以在此处找到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
的大小,加上一个char指针。
首先问自己一个日志条目甚至会是什么样子。数据结构是字符串,日志消息和time_t实体。 time_t的长度是多少?这实际上取决于你如何格式化它。弦的长度是多少?嗯,你不知道,你需要另一个功能告诉你这个。
单个日志消息的大小为: strlen(logMessage)+ strlen(格式(时间))
其中format()
是一个适当格式化时间的函数。然后,您需要递归所有日志条目,将每个日志条目相加。请务必在内存中添加日志行条目之间的换行符,然后添加最终的空字符。
这应该足以让你入门。