我正在努力学习C,但我遇到了一些愚蠢的事情。在这种情况下,我想要实现的是创建一个管理手机联系人的程序。 “工具”允许插入联系人或删除并搜索联系人。它在C中使用二进制文件,我配置了代码,因此它可以使用记录和可变长度的字段。在这种情况下,我的记录采用以下格式(有一个标题指向最后删除的记录):
record_length|name|phone|
我目前的要求是,当我选择删除记录时,我将用以下内容覆盖记录内容:
record_length * next_record*
此令牌*
标识记录状态已删除。在此之前,我对该程序感到满意。问题是程序的最后一个功能,即compress file
。
我想添加一个函数,它将读取整个文件并将 VALID 记录复制到一个新文件中,删除任何未使用的空间(例如,如果我删除长度为20或更晚的记录,或者如果我用一个长度为10的新记录覆盖记录,该过程将保留文件中的最后10个垃圾字符。
该功能实际上非常简单,基本思路是:
fread
来自sizeof(int)
的文件,以获取记录长度,直到fread
返回NULL
(文件结束) fread
一个字符
if this char == *
,我想跳过记录并转到下一个else
,返回文件中的1个位置,并将记录的有效字符复制到新文件中。现在出现了一个愚蠢的问题:如何验证字符是否为星号?我很沮丧,因为我能够实现整个代码,我唯一缺少的就是这个实现。这是我想要做的:
#define MAX_REGI_SZ 70
int main (void) {
char registro[MAX_REGI_SZ];
...
...
...
fread(registro,sizeof(char),1,in);
if (strcmp(registro,"\*")) {
/* move to the next record */
}
else {
/* valid record, copy it over to the new file */
}
...
}
我已尝试与"*"
进行比较,尝试声明一个char令牌然后make token = "*"
然后在strcmp
中使用令牌,尝试直接比较registro == "*"
,这根本不可能实现。我已经试图找到解决方案好几天没有找到任何地方,所以我放弃并在这里问C的主人。
答案 0 :(得分:1)
您是否尝试过使用fgetc()
。
#define MAX_REGI_SZ 70
int main (void)
{
char registro[MAX_REGI_SZ];
...
...
...
registro[index]=fgetc(/*Your file pointer*/)
if (registro[index] == '*') // or if (registro[index] == 42)
{
/* move to the next record */
}
else
{
/* valid record, copy it over to the new file */
}
...
}
注意代替if(registro[index] == '*'
,您也可以使用if(registro[index] == 42)
将其与角色的ASCII
值进行比较。ASCII Values Link