Как сохранить массив строк из файла ввода в элемент структуры в C? - PullRequest
0 голосов
/ 10 октября 2018

Итак, у меня есть этот текстовый файл (cartCoords.txt):

a = 2b, 1d; milk cheese eggs
b = 2a, 1e, 2c;
c = 2b, 1f;
d = 1a, 1g;
e = 1h, 1b;
f = 1i, 1c;
g = 1j, 1d;
h = 1k, 1e;
i = 1l, 1f;
j = 1m, 1g;
k = 1n, 1h;
l = 1o, 1i;
m = 2n, 1j;
n = 2m, 1k, 2o;
o = S, 2n, 1l;

Они представляют мою версию макета карты.Точка «а» находится в 2 единицах от «б» и в 1 единице от «д», а в точке а у нас есть пункты «молоко», «сыр» и «яйца».

Я построил структуру:

struct stopPoints {
   char **items;
   char connectingPoints[10];
   int  weights[10];
   int startBool;
};

Таким образом, каждая «точка остановки» (a, b, c ... и т. Д.) Содержит список элементов (молоко, сыр и т. Д.)), список связанных точек (b и d в 2b и 1d), «вес» каждой соответствующей точки подключения (2 и 1 в 2b и 1d) и логическое значение, представляющее, является ли это начальной точкой или нет(обозначается буквой «S»).

Мне удалось сохранить каждую точку соединения и ее вес в структуре каждой точки, но у меня возникли проблемы с сохранением каждой отдельной строки элементов в массиве.хочу, чтобы каждая структура имела массив, в котором хранится каждый элемент в каждом индексе, например:

["milk", "cheese", "eggs"]

Как мне поступить?

Below is my code:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 10

struct stopPoints {
   char **theItem;
   char connectingPoints[10];
   int  weights[10];
   int startBool;
};


struct stopPoints makeStruct(char* str)
{
    char items[10];
    int i,j=0,k=0, l=0, semiCheck =0, a;
    struct stopPoints point;

    for(i=4; i<strlen(str); i++)
    {
        //check if its a starting point
        if(i==4 && str[i] == 'S')
        {
            point.startBool = 1;
            i+=3;
        }
        else if(i==4)
        {
            point.startBool = 0;
        }

        //if there's no semicolon present, proceed with the code
       if (semiCheck == 0) {
            //checks if its a number
            if(str[i] < 58 && str[i] > 47){
                point.weights[j] = str[i];
                j++;
            }
            //checks if its a letter
            else if(str[i] < 122 && str[i] > 96){
                point.connectingPoints[k] = str[i];
                k++;
            }

            else if (str[i] == 59){
                semiCheck = 1;
                i++;
                }
            }
        else if(semiCheck==1){
             for (a=1; a<(strlen(str)-i); a++){
                if (str[i+a] != 32){
                    items[a-1] = str[i+a];
                }
        }

       }

    }
    return point;
}

int main(){
    int selections[100];
    int numOfItems,x,y,j,z,temp;
    int i = 0;
    struct stopPoints store[26];

    FILE *fp;
    char str[60];

    /* opening file for reading */
    fp = fopen("cartCoords.txt" , "r");
    if(fp == NULL) {
      perror("Error opening file");
      return(-1);
    }

    while( fgets (str, 600, fp)!= NULL ) {
      /* writing content to stdout */
      //printf("test1");
      store[i] = makeStruct(str);
      i++;
      printf("store[%d] connecting points = %c and %c and %c\n", i-1, store[i-1].connectingPoints[0], store[i-1].connectingPoints[1], store[i-1].connectingPoints[2]);
    }
    fclose(fp);

    return 0;
}

Выводэтой программы:

store[0] connecting points = b and d and
store[1] connecting points = a and e and c
store[2] connecting points = b and f and
store[3] connecting points = a and g and
store[4] connecting points = h and b and
store[5] connecting points = i and c and
store[6] connecting points = j and d and
store[7] connecting points = k and e and
store[8] connecting points = l and f and
store[9] connecting points = m and g and
store[10] connecting points = n and h and
store[11] connecting points = o and i and
store[12] connecting points = n and j and
store[13] connecting points = m and k and o
store[14] connecting points = n and l and

Так что я смог правильно хранить буквы и цифры. Я просто не знаю, как взять полную строку и сохранить ее в массив. Мой подход былчтобы мой цикл проверял точку с запятой (используя ее значение ascii), и однажды точка с запятойОбнаруженный, он начнет собирать каждую отдельную строку.Единственная проблема в том, что я понятия не имею, как это реализовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...