首页 > 解决方案 > 如何让我的 C 代码读取和存储文件

问题描述

我已经坚持了一段时间。我不确定如何将文件中的所有行打印到 C 终端,然后将其保存到数据结构中。我的代码如下:

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

int main()
{
    printf("Hello world!\n");
    int i = 43;// number of iteration to save data in an array
    int x;
    FILE *fptr;
    struct values *valuesPtr, values[x];
    valuesPtr = &values[x];


        if((fptr = fopen("energy.txt", "r")) == NULL)
        {
            printf ("Error opening file ");
            return 0;
        }
        while (fptr != NULL)
        {
        for(x = 0; x < i; x++ )
        {
            fscanf(fptr, "%s %s %d", &valuesPtr->start_vertex, &valuesPtr->destination_vertex, &valuesPtr->num);
            printf("\nStart vertex: %s \nDestination vertex: %s \nWeight: %d\n\n", valuesPtr->start_vertex, valuesPtr->destination_vertex, valuesPtr->num);
        }
        }
       fclose(fptr);
    return 0;
}

我的 structure.h 文件具有以下结构:

struct values{
        int num;
        char start_vertex[250];
        char destination_vertex[250];
        };

它目前只显示我文件的第一行。我希望它从文件中读取所有行,然后将该数据保存在数据结构中。您能否告诉我,我可以使用哪种最佳数据结构将文件中的所有元素保存在内存中以供以后使用。

标签: cdata-structures

解决方案


您初始化的方式valuesPtr并不准确。valuesPtr = &values[x];失败,因为数组values可以采用的最大索引是x-1(from 0 to x-1)。它是一个指针,所以分配它(不要忘记x先初始化):

 struct values *valuesPtr = malloc(sizeof(struct values) * x);
 if (!valuesPtr)
    return -1;

或使用一维数组:

/*init x here*/
struct values valuesPtr[x]

如果你想通过 using 获得价值fscanf,不要使用&forchar数组。使用如下:

int num =  fscanf(fptr, "%s %s %d", valuesPtr[i].start_vertex, valuesPtr[i].destination_vertex, &valuesPtr[i].num);
// verify the the number (num) of input items successfully matched and assigned if you want.

更新测试:

 struct values{
    int num;
    char start_vertex[250];
    char destination_vertex[250];
  };

int main()
{
    printf("Hello world!\n");
    int x = 3; // The number of lines that you want to get from file.
    FILE *fptr;
    struct values *valuesPtr = malloc(sizeof(struct values) * x);

    if (!valuesPtr)
        return -1;


    if((fptr = fopen("text.txt", "r")) == NULL)
    {
        printf ("Error opening file ");
        return 0;
    }

    for(int i = 0; i < x; i++ )
     {
            fscanf(fptr, "%s %s %d", valuesPtr[i].start_vertex, valuesPtr[i].destination_vertex, &valuesPtr[i].num);
            printf("\nStart vertex: %s \nDestination vertex: %s \nWeight: %d\n\n", valuesPtr[i].start_vertex, valuesPtr[i].destination_vertex, valuesPtr[i].num);
     }
     free(valuesPtr);
     fclose(fptr);
    return 0;
}

文本.txt

ab cd 9
ef gh 10
ii cc 11

输出:

Hello world!

Start vertex: ab 
Destination vertex: cd 
Weight: 9


Start vertex: ef 
Destination vertex: gh 
Weight: 10


Start vertex: ii 
Destination vertex: cc 
Weight: 11

推荐阅读