简体   繁体   English

从 C 中的文件读取数据

[英]Reading data from a file in C

I have a data file and I want to read it into a struct.我有一个数据文件,我想将它读入一个结构。

This is the contents of the data file这是数据文件的内容

Japan 46.2 16 12.7
Spain 42.8 18.5 39.3
Italy 53.25 19.8 32.8
France 54.5 21.1 31.4
Turkey 52.5 15.6 19.1

This is my code这是我的代码

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

int main(){
    

    struct covid
    {
        char location[100];
        double does_given;
        double full_vaccinated;
        double of_population_fully_vaccinated;
    };

    FILE *infile;
    infile=fopen("test.txt","r");
    
    if (infile == NULL)
    {
        fprintf(stderr, "\nError opening file\n");
        exit (1);
    }

    struct covid stats;
    
    while (fread(&stats,sizeof(struct covid),1,infile)){
        printf("name =%s, give =%f, full=%f, pop=%f\n",stats.location, stats.does_given, stats.full_vaccinated, stats.of_population_fully_vaccinated);
        
    };

    fclose(infile);
    return 0;
    
}

However, when I run this code, I get no output.但是,当我运行此代码时,我没有得到 output。 Why doesn't it work?为什么它不起作用?

Your file contains textual representations of numbers, you cannot blindly read that text into a struct, there is no magic that will transform the textual representation into doubles.您的文件包含数字的文本表示,您不能盲目地将该文本读入结构,没有魔法可以将文本表示转换为双精度数。

You need to read the file line by line and parse each line individually.您需要逐行读取文件并单独解析每一行。

You want something like this:你想要这样的东西:

  char line[1000];

  while (fgets(line, sizeof(line), infile)) {
    sscanf(line, "%s %lf %lf %lf", stats.location, &stats.does_given,
                  &stats.full_vaccinated, &stats.of_population_fully_vaccinated);

    printf("name =%s, give =%f, full=%f, pop=%f\n", stats.location, stats.does_given,
            stats.full_vaccinated, stats.of_population_fully_vaccinated);
  };

Disclaimer: there is no error checking whatsoever.免责声明:没有任何错误检查。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM