【发布时间】:2014-10-26 22:59:05
【问题描述】:
我正在做一个项目,但遇到了一个非常烦人的问题。我有一个文件,其中存储了我的帐户收到的所有消息。消息是这样定义的数据结构:
typedef struct _message{
char dest[16];
char text[512];
}message;
dest 是一个不能包含空格的字符串,这与其他字段不同。
字符串是使用fgets() 函数获取的,因此dest 和text 可以具有“动态”长度(从1 个字符到length-1 个合法字符)。请注意,在从标准输入检索到每个字符串后,我手动删除了换行符。
“收件箱”文件使用以下语法存储消息:
dest
text
例如,如果我收到 Marco 发来的一条消息,上面写着“你好,你好吗?”以及来自 Tarma 的另一条消息“你今天要去健身房吗?”,我的收件箱文件看起来像这样:
Marco
Hello, how are you?
Tarma
Are you going to the gym today?
我想从文件中读取用户名并将其存储在字符串 s1 中,然后对消息执行相同操作并将其存储在字符串 s2 中(然后重复操作直到 EOF),但由于 text 字段承认我不能真正使用的空间fscanf()。
我尝试使用fgets(),但正如我之前所说,每个字符串的大小都是动态的。例如,如果我使用fgets(my_file, 16, username),它最终会读取不需要的字符。我只需要读取第一个字符串直到到达\n,然后读取第二个字符串直到到达下一个\n,这次包括空格。
知道如何解决这个问题吗?
【问题讨论】:
-
fgets在换行符或 EOF 处停止。如果你已经剥离了新行,你不知道字符串的精确长度吗? -
你传递给
fgets()的16是字符串的最大长度。fgets()在 (16-1) 字符或换行符或 EOF 处停止 -
@Tony 当我从文件中检索字符串时,我不知道确切的长度,我只知道字符串可以具有的最大长度(dest 为 16 个字符,文本为 512 个字符,包括 \0 ) 很抱歉让自己不清楚。
-
@Weather Vane 你是对的。也许我应该更改用于在文件中写入消息的语法...