c - 如何从c中的文件中读取带有空格、整数和浮点值的字符串?

标签 c gcc

嗨,首先让我准确地说,我有一个以下格式的数据文件:

sample file

第一行包含一个字符串,后跟三个整数和一个 float 据类型。
第二行包含带有空格的字符串,后跟三个整数和 float 据类型。
最后一行包含一个字符串,后跟三个整数和一个 float 据类型。
我的目标是读取这些数据并分配给一个结构数组,数组中的一个结构包含一行字符串、3个整数和1个 float 。 我使用以下代码绑定(bind)并成功读取字符串没有空格的行,但无法读取带空格的字符串:

void readFromDatabase(struct student temp[], int *no) {
    FILE *filepointer;
    int i = 0;
    if ((filepointer = fopen("database", "r")) == NULL) {
        printf("Read error");
        return;
    }
    while (fscanf(filepointer, "%10s\t%d%d%d%f\n", temp[i].name,
            &temp[i].birthday.date, &temp[i].birthday.month,
            &temp[i].birthday.year, &temp[i].gpa) != EOF && i < MAX_CLASS_SIZE) {
        ++i;
    }
    *no = i;
    fclose(filepointer);
}

我得到了以下意想不到的输出:

Unexpected output


我试图循环遍历结构数组并以上述格式显示数据。
但是我没有得到 3 行输出,而是得到了 4 行。
我真的需要关于这个主题的一些帮助。
提前致谢...

我在ubuntu 16.04下使用gcc来编译和执行程序..

最佳答案

fscanf 格式字符串中,使用 %10[^\t] 而不是 %10s。这将匹配名称的每个字符,直到制表符分隔符。

不幸的是,您没有给出完整的示例,所以这是我在 Ubuntu 16.04 上测试的小程序:

#include <stdio.h>
#include <stdlib.h>

#define MAX_CLASS_SIZE 4

struct student {
        char name[11];
        struct {
                int date;
                int month;
                int year;
        } birthday;
        float gpa;
};

int main(void) {
        FILE *filepointer;
        int i = 0;
        int no;
        struct student temp[MAX_CLASS_SIZE];
        if ((filepointer = fopen("data.txt", "r")) == NULL) {
                printf("Read error");
                return EXIT_FAILURE;
        }
        while (fscanf(filepointer, "%10[^\t]\t%d%d%d%f\n", temp[i].name,
                                &temp[i].birthday.date, &temp[i].birthday.month,
                                &temp[i].birthday.year, &temp[i].gpa) != EOF && i < MAX_CLASS_SIZE) {
                ++i;
        }
        no = i;
        fclose(filepointer);

        for(i = 0; i < no; i++) {
                printf("%s: %d-%d-%d %f\n",
                        temp[i].name,
                        temp[i].birthday.date, temp[i].birthday.month, temp[i].birthday.year,
                        temp[i].gpa
                );
        }
        return EXIT_SUCCESS;
}

根据您的格式字符串,我假设数据库中的所有值均由制表符分隔。

关于c - 如何从c中的文件中读取带有空格、整数和浮点值的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39766796/

相关文章:

c - gcc中pkg-config的意义是什么?

c++ - 公共(public)和私有(private)领域的内存分配 - GCC方式

c - 打印一个字符数组(C)只有第一个字母

c - TCP校验和C代码返回错误结果

java - 贝塞尔低通算法

在 Linux mint 中从 C 程序创建临时文件

c - 需要写一个cast操作符

c - 我在尝试打开一个文件并将其写入另一个文件时遇到段错误

c - 将用户 C 字符串输入到 c 中的 exec() 函数中

c - 创建词法分析器时缺少 .h 文件