我正在处理一个项目,遇到了一个非常烦人的问题。我有一个文件存储了我帐户收到的所有消息。一条消息是按以下方式定义的数据结构:
"dest"是一个字符串,不能包含空格,而其他字段可以。字符串使用“fgets()”函数获取,因此“dest”和“text”可以具有“动态”长度(从1个字符到length-1个合法字符)。请注意,我手动删除每个字符串从stdin中检索后的换行符。
“inbox”文件使用以下语法存储消息:
因此,例如,如果我收到了Marco的信息,内容是“你好,你怎么样?”和Tarma的信息,内容是“你今天要去健身房吗?”,我的收件箱文件将如下所示:
我想从文件中读取用户名并将其存储在字符串s1中,然后对消息执行相同的操作,并将其存储在字符串s2中(并重复此操作直到EOF),但由于text字段允许空格,因此我无法真正使用fscanf()。 我尝试使用fgets(),但正如我之前所说,每个字符串的大小是动态的。例如,如果我使用fgets(my_file,16,username),它最终会读取不需要的字符。我只需要读取第一个字符串直到达到\n,然后读取第二个字符串直到下一个\n被读取,这次包括空格。 你有任何解决这个问题的想法吗?
typedef struct _message{
char dest[16];
char text[512];
}message;
"dest"是一个字符串,不能包含空格,而其他字段可以。字符串使用“fgets()”函数获取,因此“dest”和“text”可以具有“动态”长度(从1个字符到length-1个合法字符)。请注意,我手动删除每个字符串从stdin中检索后的换行符。
“inbox”文件使用以下语法存储消息:
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
会在遇到换行符或者文件结束符时停止读取。如果你已经去掉了换行符,那么你不是已经知道字符串的确切长度了吗? - Tonyfgets()
的 16 是字符串的 最大 长度。fgets()
在 (16-1) 个字符、换行符或 EOF 处停止。 - Weather Vane