c - 从文件中读取带空格的字符串

标签 c fgets scanf

我正在做一个项目,我刚刚遇到了一个非常烦人的问题。我有一个文件,用于存储我的帐户收到的所有消息。消息是这样定义的数据结构:

typedef struct _message{
char dest[16]; 
char text[512];
}message;

dest 是一个不能包含空格的字符串,这与其他字段不同。 使用 fgets() 函数获取字符串,因此 desttext 可以具有“动态”长度(从 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/

相关文章:

c - 不使用头文件是否可以编写C程序?

c++ - 如何使用 C 语言构建游戏,并使用 Lua 编程 Actor ?

c - 使用 getline 与 fgets 进行基本文件打印

C 文件读取不会读取字符串中的数字数组

c - C 语言中 fgets 不返回 NULL

c - 格式字符串中的空格 (scanf)

C 正则表达式库代码帮助

c - 为什么 load_ps() 在一台 PC 上工作但在另一台 PC 上不工作?

C、从文件读入数组,逐个编号

C:fscanf 删除整数变量值?