Как читать данные и записывать данные C Программирование - PullRequest
0 голосов
/ 02 марта 2020
 #include <stdio.h>


#include <stdlib.h>

struct customer {
   char  fname[20],lname[20];
   int   acct_num;
  float acct_balance;
};

void main ()
{
    FILE *outfile;
  struct customer input;

  // open Accounts file for writing
  outfile = fopen ("C:\\Users\\Admin\\Desktop\\read\\per.dat","w");
   if (outfile == NULL)
     {
     fprintf(stderr, "\nError opening accounts.dat\n\n");
      exit (1);
    }

  // instructions to user
   printf("Enter \"stop\" for First Name to end program.");

  // endlessly read from keyboard and write to file
   while (1)
    {
     // prompt user
      printf("\nFirst Name: ");
     scanf ("%s", input.fname);
     // exit if no name provided
      if (strcmp(input.fname, "stop") == 0)
        exit(1);
     // continue reading from keyboard
      printf("Last Name : ");
     scanf ("%s", input.lname);
      printf("Acct Num  : ");
      scanf ("%d", &input.acct_num);
      printf("Balance   : ");
      scanf ("%f", &input.acct_balance);

      // write entire structure to Accounts file
      fwrite (&input, sizeof(struct customer), 1, outfile);
    }
   FILE *infile;
   /*** open the accounts file ***/
   infile = fopen ("C:\\Users\\Admin\\Desktop\\read\\per.dat","r");
   if (infile == NULL)
     {
     fprintf(stderr, "\nError opening accounts.dat\n\n");
      exit (1);
     }

  while (fread (&input, sizeof(struct customer), 1, infile))
      printf ("Name = %10s %10s   Acct Num = %8d   Balance = %8.2f\n",
              input.fname, input.lname, input.acct_num, input.acct_balance);

 }

при вводе информации в программу, она просто записывает случайные символы в файл .dat и не отображает информацию, которую я написала. Пожалуйста, помогите мне найти проблему этого.

1 Ответ

2 голосов
/ 02 марта 2020

У вас есть:

    if (strcmp(input.fname, "stop") == 0)
        exit(1);

На этом ваша программа заканчивается на этом этапе. Я не думаю, что ты этого хочешь. Скорее сломайте свой l oop:

    if (strcmp(input.fname, "stop") == 0)
        break;

Кроме того, обязательно закройте файл после того, как вы закончите запись в него и перед тем, как открыть его для чтения. В противном случае он может не существовать или вывод на него не может быть сброшен:

fclose(outfile);

Наконец, обратите внимание, что fwrite() запишет двоичные данные вашей структуры. Это будет выглядеть как мусор для человеческого глаза, даже если fread() должен читать это правильно. Но обратите внимание, что вы должны открыть файл как двоичный файл как для чтения, так и для записи. В противном случае некоторые системы (по крайней мере, Windows) будут выполнять некоторую интерпретацию данных.

outfile = fopen ("C:\\Users\\Admin\\Desktop\\read\\per.dat","wb");

infile = fopen ("C:\\Users\\Admin\\Desktop\\read\\per.dat","rb");

С этими изменениями ваш код, как мне кажется, будет работать нормально.

Знайте что запись и чтение двоичных данных таким способом может быть сопряжено с опасностью, если вы используете разные платформы для записи и чтения, отправки данных по сети или, возможно, даже используете разные опции компиляции. Порядок следования байтов («порядковый номер байтов»), размеры типов данных и заполнение структуры могут вызвать проблемы. Для реальных задач лучше использовать какую-нибудь портативную сериализацию.

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