Например, у меня есть две строки чисел, как показано ниже

12,4,11,16,3,20,9,19,17,15

20,3,10,12,18,2,5,14,15,16

Я хочу читать эти числа из .txt файла построчно, и каждая строка должна быть отдельным односвязным списком. Должен ли я создать 10 различных переменных для каждой строки, чтобы хранить эти числа? Я пробовал это сделать, но не смог получить эти числа таким образом.

Это правильный способ?

  #include 
  #include 

struct list
{
  int data;
  struct list * next;
}list2;

struct list *head=NULL;


typedef struct list list;

void display();



int main() {

  list * node1 = (list *)malloc(sizeof(list));
  list * node2 = (list *)malloc(sizeof(list));
  list * node3 = (list *)malloc(sizeof(list));
  list * node4 = (list *)malloc(sizeof(list));
  list * node5 = (list *)malloc(sizeof(list));
  list * node6 = (list *)malloc(sizeof(list));
  list * node7 = (list *)malloc(sizeof(list));
  list * node8 = (list *)malloc(sizeof(list));
  list * node9 = (list *)malloc(sizeof(list));
  list * node10 = (list *)malloc(sizeof(list));

  FILE *dosya = fopen("data.txt","r");
  int filenum;



  fscanf(dosya,"%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",&node1->data,&node2->data,&node3->data,&node4->data,&node5->data,&node6->data,&node7->data,&node8->data,&node9->data,&node10->data);
  
   return 0;
}

Ответы (1)

Почему вы жестко кодируете 10? Давайте просто не будем этого делать.

struct list *read_list(const char *filename)
{
    errno = 0;
    struct list *head;
    FILE *dosya = fopen("data.txt","r");
    if (!dosya) return NULL;
    head = malloc(sizeof(*head));
    if (fscanf(dosya, "%d", &head->data) < 1) {
        fclose(dosya);
        free(head);
        return NULL;
    }
    for(struct list **ptr = &head->next;;ptr = &ptr[0]->next) {
         *ptr = malloc(sizeof(**ptr));
         if (!*ptr) {
             fclose(dosya);
             return head;
         }
         if (fscanf(dosya, ",%d", &ptr[0]->data) < 1) {
             fclose(dosya);
             free(*ptr);
             *ptr = NULL;
             return head;
         }
    }
}

Ух ты. Давайте разберем это на части. Функция открывает файл, инициализирует связанный список и считывает первый элемент в голову связанного списка. Это самая простая часть.

Затем выполняется цикл, который выделяет еще один узел в конце связанного списка и считывает запятую в ничто и следующее целое число в новый узел. Если больше целых чисел нет, он избавляется от только что добавленного узла и возвращает результат.

Список возвращается, если в файле было найдено хотя бы одно целое число. Проверьте errno, чтобы узнать, произошло ли частичное чтение.

2022 WebDevInsider