我正在做一个项目,我刚刚遇到了一个非常烦人的问题。我有一个文件,用于存储我的帐户收到的所有消息。消息是这样定义的数据结构:
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
,这次包括空格。
关于如何解决这个问题有什么想法吗?
最佳答案
#include <stdio.h>
int main(void){
char username[16];
char text[512];
int ch, i;
FILE *my_file = fopen("inbox.txt", "r");
while(1==fscanf(my_file, "%15s%*c", username)){
i=0;
while (i < sizeof(text)-1 && EOF!=(ch=fgetc(my_file))){
if(ch == '\n' && i && text[i-1] == '\n')
break;
text[i++] = ch;
}
text[i] = 0;
printf("user:%s\n", username);
printf("text:\n%s\n", text);
}
fclose(my_file);
return 0;
}
关于c - 从文件中读取带空格的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26578947/