将.txt文件存储到结构中

时间:2016-05-03 10:30:06

标签: c

我正在尝试将.txt文件存储到struct中,但没有成功。 我不需要存储第一行,但我确实需要其余的。 多谢你们 !! =)

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

int main(int argc, const char * argv[]) {
    // insert code here...
    printf("Hello, World!\n");

    struct candidates
    {
        char name[25];
        char gender[5];
        int height;
        int weight;
    };

    struct candidates values[25];

    FILE *fp;
    if ((fp=fopen("candidatesdata.txt","r"))==NULL){printf("Unable to open file\n");}


    int x = 0;
    int iterations = 0;
    while((fscanf(fp,"%s,%s,%d,%d",&values[x].name, &values[x].gender, &values[x].height, &values[x].weight))!=EOF)
        {
            x++;
            iterations +=1;
        }
    fclose(fp);

    //values[15].weight = 300;

    printf("\n%d\t%d",iterations,values[1].height);


    return 0;
}

文本文件如下所示:

Name,Gender,Height,Weight
Tanner,M,71.8,180.25
John,M,70.75,185.3
Parker,F,65.25,120.3
Meeks,M,57.25,210.2

3 个答案:

答案 0 :(得分:0)

此代码执行以下两项操作;第一种是将数据写入.txt文件,第二种是从.txt文件中读取数据,并以结构数据类型存储,这是您尝试实现的,但仅适用于单个实体。接下来,您应该为实体实现此目的。

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

typedef struct{
    char name[30];
    //other fields
}Candidate;

typedef struct{
    Candidate c;
    char city[30];
    int vote;
}CityVotes;

//for .bin operations
void write_to_file(FILE *f)
{
    Candidate c;
    CityVotes cv;

    printf("Enter candidate name : ");
    scanf("%s",&c.name);
    cv.c = c;
    printf("Enter the city : ");
    scanf("%s",&cv.city);
    printf("Enter the vote : ");
    scanf("%d",&cv.vote);
    fwrite(&cv, sizeof(cv), 1, f);
}
//for .txt operations
void write_to_file1(FILE *f)
{
    Candidate c;
    CityVotes cv;

    printf("Enter candidate name : ");
    scanf("%s",c.name);
    cv.c = c;
    printf("Enter the city : ");
    scanf("%s",&cv.city);
    printf("Enter the vote : ");
    scanf("%d",&cv.vote);
    fprintf(f,"%s ", cv.c.name);
    fprintf(f,"%s ", cv.city);
    fprintf(f,"%d ", cv.vote);
}
//for .bin operations
void read_file(FILE *f)
{
    CityVotes cv;
    while(fread(&cv, sizeof(cv), 1, f)){
        printf("Candidate : %s\t",cv.c.name);
        printf("City.: %s\t",cv.city);
        printf("Vote.: %d\n",cv.vote);
    }
}
//for .txt operations
void read_file1(FILE *f){
    CityVotes cv;
    fscanf(f," %s", &cv.c.name);
    fscanf(f," %s", &cv.city);
    fscanf(f," %d", &cv.vote);

    printf("Candidate : %s\t",cv.c.name);
    printf("City.: %s\t",cv.city);
    printf("Vote.: %d\n",cv.vote);
}
int main(void)
{
    FILE *f;
    f=fopen("candidates.txt","w");
    write_to_file1(f);
    fclose(f);
    f=fopen("candidates.txt","r");
    read_file1(f);
    return 0;
}

请注意,代码只是示例,您应该检查空值。

答案 1 :(得分:0)

struct candidates
    {
        char name[25];
        char gender[5]; // can be char gender too !!
        int height; // should be changed to float height
        int weight; // should be changed to float height
    };

如果您实际拥有:

Name,Gender,Height,Weight

在您的文件中,您可以在转到while循环之前执行此操作:

char somebigstring[100];
.
.
.
if(fscanf(fp,"%s",somebigstring) == EOF) //wasting the first line
   exit(-1); // exiting here if there is no first line

答案 2 :(得分:0)

像这样解决:

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

struct candidates{
    char name[25];
    char gender[7];//Female+1
    float height;
    float weight;
};

int main(void) {
    struct candidates values[25];

    FILE *fp;
    if ((fp=fopen("candidatesdata.txt","r"))==NULL){
        fprintf(stderr, "Unable to open file\n");
        exit(EXIT_FAILURE);
    }

    char line[64];
    int x = 0;
    int iterations = 0;
    while(fgets(line, sizeof line, fp)){
        iterations += 1;
        if(x < 25 && sscanf(line, "%24[^,],%6[^,],%f,%f", values[x].name, values[x].gender, &values[x].height, &values[x].weight)==4){
            x++;
        } else if(iterations != 1){
            fprintf(stderr, "invalid data in %d line: %s", iterations, line);
        }
    }
    fclose(fp);

    for(int i = 0; i < x; ++i){
        printf("%s,%c,%.2f,%.2f\n", values[i].name, *values[i].gender, values[i].height, values[i].weight);
    }

    return 0;
}