用C解析wtmp日志

用C解析wtmp日志,c,file-io,struct,fread,C,File Io,Struct,Fread,对于我们的作业,我们得到了一份wtmp日志的副本,并希望对其进行解析,并以排序格式输出,类似于last的输出 现在,我知道文件wtmp由utmp结构列表组成。提供的文件保证至少包含一个utmp结构,我假设二进制文件中的所有结构都构造正确 我已经通读了manutmp,并且成功地编写了一个程序,从提供的二进制文件中读取结构。(我为冗长的打印方法道歉) 我的输出: ... ut_line: pts/2, ut_id: ts/2jsmith, ut_user: jsmith, ... 我不太清楚这里发

对于我们的作业,我们得到了一份
wtmp
日志的副本,并希望对其进行解析,并以排序格式输出,类似于
last
的输出

现在,我知道文件
wtmp
utmp
结构列表组成。提供的文件保证至少包含一个utmp结构,我假设二进制文件中的所有结构都构造正确

我已经通读了
manutmp
,并且成功地编写了一个程序,从提供的二进制文件中读取结构。(我为冗长的打印方法道歉)

我的输出:

... ut_line: pts/2, ut_id: ts/2jsmith, ut_user: jsmith, ...
我不太清楚这里发生了什么。我认为可能发生的情况是,ut_id字段可能不存在于我正在读取的结构中。我认为这可以解释为什么ut_id字段显示为它两侧的字段挤压在一起

我认为我可以使用fprintf格式来正确显示字段,但似乎只能将文本格式设置为字符数组的一侧或另一侧,而不能从字符串内部获取特定部分

否则,我就迷路了。这只是我对结构的理解上的一个差距吗

不是寻找答案,更多的是朝着正确的方向前进

另外,终端名称后缀是什么?这只是
pts/
后面的数字吗?

表示“如果字符串字段小于字段大小,则以空字节('\0')终止。”因此,特别是,如果字符串字段与字段大小相同,则不会以空字节终止。格式良好的C字符串必须以空字节结尾。它看起来像
ut\u id
字段是4个字符长的“ts/2”,这表明它没有终止的空字节

您正在使用%s格式化参数将字符数组打印到
printf
。这会一直打印,直到达到空字节。我建议您需要将
utmp
的每个字段复制到一个临时字符数组中,该数组比
utmp
结构中的大小大一个。确保该临时数组的最后一个字节是空字节,并且它应该输出为OK

char ut_id[4];      /*Terminal name suffix, or inittab(5) ID */
... ut_line: pts/2, ut_id: ts/2jsmith, ut_user: jsmith, ...