简体   繁体   English

用c编程语言将数据从文件读取到结构中

[英]Reading data from file into structure in c programming language

I want to read data from txt file and save those data in variables not just print output.我想从 txt 文件中读取数据并将这些数据保存在变量中,而不仅仅是打印输出。 How do I save those data from text file in variables?如何将文本文件中的这些数据保存在变量中? I tried like this and it did not work out:我试过这样,但没有成功:

int value1 ; 
object2->value =&value1 ; 
*(object2->value) = value1 ; 

My txt file looks like this:我的 txt 文件如下所示:

INT 
A
5

and my code looks like this:我的代码如下所示:

#include <stdio.h>
#include <stdlib.h> // For exit()

struct variable {
    char type[10];
    char name[10];
    int value;
};

int main(){

struct variable *object2=malloc(sizeof(struct variable));

    FILE * file= fopen("input.txt", "rb");
    if (file != NULL) {
        fread(object2, sizeof(struct variable), 1, file);
        fclose(file);
    }
    
    int value1 ;
    object2->value =&value1 ;
    *(object2->value) = value1 ;

    printf("%d\n",value1);

    printf("%s/%s/%d\n",object2->type,object2->name,object2->value);
    
    
    }

File format:文件格式:

CHAR
B
6
INT
A
5
FLOAT
C
7

This is my solution:这是我的解决方案:

#include <stdio.h>
#include <stdlib.h> // For exit()
#include <string.h>

#define BUFF_SIZE 1024
#define NAME_TYPE_SIZE 10
#define VALUE_SIZE 20

#define NOT_ENOUGH_MEMORY 1
#define CANT_OPEN_FILE 2
#define FILE_ENDED 3
#define TOO_BIG_STR 4
#define CANT_FORMAT_VALUE 5
#define NOT_FOUND_LINE 6

#define SEARCH_NAME "A"

#pragma warning(disable : 4996) // for vs

struct variable {
    char type[NAME_TYPE_SIZE];
    char name[NAME_TYPE_SIZE];
    int value;
};

int find_var_in_file(char* file_path, char* find_name, struct variable* dest);

int main()
{
    struct variable* object2 = malloc(sizeof(struct variable));

    if (NULL == object2)
    {
        printf("not enough memory");
        return NOT_ENOUGH_MEMORY;
    }

    int error = find_var_in_file("input.txt", SEARCH_NAME, object2);

    if (CANT_OPEN_FILE == error)
    {
        return printf("can't open file");
    }

    if (error == 0)
    {
        // Printing data to check validity
        printf("read: type: %s name: %s value: %d", object2->type, object2->name, object2->value);
        int a = object2->value;
        // do stuff with a
    }
    else
    {
        if (error == NOT_FOUND_LINE)
        {
            printf("not find the var \"" SEARCH_NAME "\" in the file");
        }
        else
        {
            printf("error reading the file. error code: %d", error);
        }
    }

    free(object2);

    return 0;
}

int read_line(char* buffer, int buffer_size, char* dest, int dest_size, FILE* stream)
{
    if (!fgets(buffer, buffer_size, stream))
    {
        return NOT_FOUND_LINE;
    }

    int read_len = strlen(buffer);

    if ('\n' == buffer[read_len - 1])
    {
        if (read_len == 1)
        {
            return NOT_FOUND_LINE;
        }
        buffer[read_len - 1] = '\0'; // remove "\n" in the end
    }

    if (dest_size <= strlen(buffer)) // last chat is null
    {
        return TOO_BIG_STR;
    }

    strcpy(dest, buffer);

    // clear the read
    memset(buffer, '\0', read_len);

    return 0;
}

int find_var_in_file(char* file_path, char* find_name, struct variable* dest)
{
    char file_buffer[BUFF_SIZE] = { 0 }; // Buffer to store data
    FILE* stream = fopen(file_path, "r");
    if (NULL == stream)
    {
        return CANT_OPEN_FILE;
    }

    int error = 0;
    while (1)
    {
        // read type
        int read_type_result = read_line(file_buffer, BUFF_SIZE, dest->type, NAME_TYPE_SIZE, stream);
        if (read_type_result != 0)
        {
            error = read_type_result;
            break;
        }

        int read_name_result = read_line(file_buffer, BUFF_SIZE, dest->name, NAME_TYPE_SIZE, stream);

        if (read_name_result != 0)
        {
            error = read_name_result;
            break;
        }

        char value_buffer[VALUE_SIZE] = { 0 };
        int read_value_result = read_line(file_buffer, BUFF_SIZE, value_buffer, VALUE_SIZE, stream);
        if (read_value_result != 0)
        {
            error = read_value_result;
            break;
        }

        if (0 == strcmp(find_name, dest->name))
        {
            if (1 != sscanf(value_buffer, "%d", &dest->value))
            {
                error = CANT_FORMAT_VALUE;
            }
            break;
        }
    }

    fclose(stream);

    return error;
}

You just need to call the function find_var_in_file like in main.您只需要像在 main 中一样调用函数find_var_in_file I loop over all the lines of the file and search for the var name.我遍历文件的所有行并搜索 var 名称。 If have formating error or not find the name of the var in the file return the error code.如果有格式错误或在文件中找不到 var 的名称,则返回错误代码。

If the file you are trying to read is a text file (which it is in your case), then use fgets() to read its content.如果您尝试读取的文件是文本文件(在您的情况下),则使用fgets()读取其内容。 Also, if its content has a consistent format, then consider using sscanf() to do your parsing.此外,如果其内容具有一致的格式,则考虑使用sscanf()进行解析。

I don't understand why you are using a pointer to struct variable to save data.我不明白您为什么使用指向struct variable的指针来保存数据。 You can simply use a struct variable object and access its fields with .您可以简单地使用struct variable对象并使用.

Your code should look something like that:您的代码应如下所示:

#include <stdio.h>
#include <stdlib.h> // For exit()
#include <string.h> // for strlen()

struct variable {
    char type[10];
    char name[10];
    int value;
};

int main()
{
    FILE *file = fopen("input.txt", "r");
    if (!file) {
        fprintf(stderr, "Could not read file\n");
        return 1;
    }

    struct variable object2;
    char buffer[1024];

    while (fgets(buffer, 1024, file)) {
        if (sscanf(buffer, "%9s %9s %d", object2.type, object2.name, &object2.value) != 3) {
            fprintf(stderr, "Error parsing file\n");
            fclose(file);
            return 1;
        }

        printf("%s %s %d\n", object2.type, object2.name, object2.value);
    }

    fclose(file);
}

Now, if you want to store all the lines of your file into variable s to use them later, then first you need to count the number of lines in your file (let's call it n ) and second, allocate a dynamic array of size n .现在,如果您想将文件的所有行存储到variable s 中以供以后使用,那么首先您需要计算文件中的行数(我们称之为n ),然后分配一个大小为n的动态数组.

fscanf(file,"%s\n%s\n%d\n",object2->type,object2->name,&object2->value);

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

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