C ---- Как я могу поместить ВСЕ файл IO запись в моем массиве успешно?благодарю вас - PullRequest
0 голосов
/ 24 ноября 2018

У меня есть текстовый файл с данными по умолчанию, которые я создал.Теперь я хочу поместить их в мой массив.Но не успех ... Я не знаю, почему только первая запись данных структуры может храниться в моем массиве.

Я хочу, чтобы первые 9 записей были сохранены в Arr [0], secord 9 записей сохранены в Arr [1]и третья 9-я запись хранится в Arr [2], но в результате получается, что только recordNum может хранить в Arr [I].

Я очень благодарен и горжусь вами, если вы можете мне помочь, потому что я стараюсь много разне успех

Вот мое содержимое файла данных:

1001 - bric - 1 - human - 10 - 70.00  - Eric - home - arrive

1002 - She  - 1 - human - 10 - 50.00  - she  - home - arrive

1003 - She  - 2 - human - 10 - 120.00 - Eric - home - arrived

Вот мой код:

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

struct record{
   char recordnum [40];
   char itemrecord [40];
   char quantity [40];
   char weight [40];
   char itemname [40];
   char catagory [40];
   char recipient [40];
   char final_destination [40];
   char status [40];
};

int main(){
   FILE *fileptr1, *fileptr2, fileptr3;
   char filename[40]="data.txt";
   int save; 
   char delete_num ;
   char reply;
   int  n=1 , i=0;
   #define MAX 9
   struct record Arr[MAX];

   printf("Enter file name: ");
   scanf("%s", filename);

   //open file in read mode
   fileptr1 = fopen(filename, "r");
   if (fileptr1== NULL){
      printf("open unsuccessful,file not exist"); 
      exit(1);
   }

   while(n>0){
      n=fscanf(fileptr1,"%s %s %s %s %s %s %s %s %s",Arr[i].recordnum, 
      Arr[i].itemname, Arr[i].itemrecord, Arr[i].catagory, Arr[i].quantity, 
      Arr[i].weight, Arr[i].recipient, Arr[i].final_destination, 
      Arr[i].status ); 
      i++;
   }
   n=i;
   for(i=0; i<n-1 ;i++){
      printf("%s \n"  ,Arr[i]);
   }
   fclose(fileptr1);
   return 0;
}

Результат:

Enter file name: data.txt
1001
1002
1003

1 Ответ

0 голосов
/ 24 ноября 2018

Формат "%s" функции printf предназначен для строк.Строки в c представлены как одномерные массивы (или указатель на часть памяти), содержащие символы и , оканчивающиеся символом '\ 0' .

Здесь вы пытаетесь напечататьпеременная типа struct record с этим форматом, которая является неопределенным поведением, в вашем примере случается, что байты, обозначенные Arr + i (который является адресом значения Arr[i] типа struct record), являются байтами Arr[i].recordnum, поэтому, поскольку вы указали printf обрабатывать эти байты как строку, используя формат "%s", символы печатаются до тех пор, пока не будет встречен символ '\0'.Однако это неопределенное поведение, поскольку в зависимости от архитектур структуры могут иметь байты заполнения в начале вместо байтов своего первого поля.

Не существует формата printf для печати вашей пользовательской структуры, поэтому вам нужно вручнуюнапечатайте каждое из ваших полей структуры, используя их соответствующие форматы, в вашем случае %s.

printf("%s, ..., %s\n", Arr[i].recordnum, ..., Arr[i].status);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...