C:将数据值读入结构

标签 c file pointers struct

我有一个包含信息的 csv 文件,其中的各个部分用“,”分隔。我想做的是获取此信息并将其存储在不同的结构变量中,但我不知道如何制作以便将信息存储在那里。

这是我的主文件:

struct items beer [100];

int main(int argc, char **argv) {
    char *oneline, *tok;
    char envara[512];
    char delim [] = ",";
    FILE *fp;
    int i = 0;
    fp = fopen("varor.csv", "r");

    printf("ID\n");

    while (!feof(fp)) {
        if (fp == NULL) {
            fprintf(stderr, "File varor.csv could not be opened\n");
            exit(-1);
        }
        fgets(envara, 512, fp);
        envara[strlen(envara) -1] = '\0'; 

        printf("En rad; %s\n", envara);

        oneline = strdup(envara);
        tok = strtok(oneline, delim);

        while (tok != NULL) {
            printf("%s\n", tok);
            tok = strtok(NULL,delim);
        }
    }
    return 0;
}

这是我的结构:

struct items {
    int itemnumber;
    char name [100];
    float price;
    float volyme;
    char types [100];
    char style [100];
    char package [20];
    char country [20];
    char producer [50];
    float alcohol_amount;
};

最佳答案

逐行读取文件应该使用 fgets 来完成.如果您读取的流位于文件末尾,它将返回一个空指针。使用 feofwrong .

尽管标记读取行有时是一种更好的方法,但您可以使用 sscanf也可以将每一行的数据提取到您的 struct items 中。为了使我的示例更易于阅读,我更改了 struct items 如下:

typedef struct item_t {
    char name[20];
    float weight;
    unsigned long id;
    float price;
} Item;

如果您的 CSV 文件中没有标题行,您可以像这样简单地解析它:

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

#define MAX_ITEM 5

typedef struct item_t {
    char name[20];
    float weight;
    unsigned long id;
    float price;
} Item;

int main() {
    Item items[MAX_ITEM];
    int i = 0, parsedData;

    char line[512];
    FILE* csvFile = fopen("test.csv", "r");

    if(csvFile == NULL) {
        perror("Failed to open file.");
        exit(EXIT_FAILURE);
    }

    while(fgets(line, sizeof(line), csvFile) != NULL && i < MAX_ITEM) {
        parsedData = sscanf(line, "%20[^,],%f,%lu,%f",
                items[i].name, &items[i].weight, &items[i].id, &items[i].price);
        if(parsedData == 4)
            items[i++].name[19] = '\0';
        else
            fprintf(stderr, "Format error in line: %s\n", line);
    }

    fclose(csvFile);
    return 0;
}

在我的示例中,第一个值也可以包含空格,格式字符串的 %20[^,] 部分表示:读取任何不是逗号的字符,最多 20 个字符。

Live Demo

注意:使用sscanf 函数并不安全,它会在很多方面导致溢出和未定义的行为。因此,您有责任使格式字符串能够解析 CSV 文件的字段,并使 sscanf 函数的参数列表保持正确。如果在第一个逗号之前包含超过 20 个字符,我的示例将跳过当前行,但是例如如果为 id 指定的数字太长,则无法防止整数溢出。要编写更安全的代码,请考虑通过适当的输入检查为每个不同的字段编写自己的转换函数,然后使用例如使用这些函数对行进行标记化以填充您的 struct items

关于C:将数据值读入结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48023977/

相关文章:

c - 文件之间的变量

javascript - 创建密码扰码器

java - 从 RAM 运行 Java 应用程序

java - 在 Android Studio 上测试时尝试读取文件时,应用程序会关闭

string - 查找单词并在其后加空格

c - 指针声明

c - 将 2D 数组指针传递给 C 中的函数

c - AT 命令响应(了解 Arduino 上的代码执行顺序)

c - 将 __attribute__((used)) 设置为 C 变量/常量无效

java - Java中如何指定文件路径?