Печать структуры в файл с печатью всех пустых элементов массива char - PullRequest
0 голосов
/ 02 июня 2019

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

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
struct hdr
{
  int file_size;
  char deleted[1];
  char file_name[256];
};

int main()
{

  //Open the main file, check if the main header exists
  FILE *fp;
  int exists = 0;
  fp = fopen("CS3411TAR.txt","a+b");

  //Check if exists
  char* buf[100];
  while(fscanf(fp," %*s %*s %s ",buf) >0){
    exists = 1;
  }



  if(exists == 0){
    //file header DNE
    struct  hdr create = {atoi("-10"),"0","CS3411 TAR"};
    fwrite( &create, sizeof(struct hdr),1,fp);

  }
  //To-Do  open file arguments names create headers and write

  fclose(fp);



  return 0;
}


Это вывод файла, некоторые элементы были удалены, так как он просто продолжается более 200 с лишним раз

öÿÿÿ0CS3411 TAR^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@

Я надеюсь на вывод

-10
0
CS3411 TAR

1 Ответ

0 голосов
/ 02 июня 2019

Помните, что для выражения if необходимо выражение для оценки.

Ваше выражение exists = 0 всегда приводит к значению exists, равному 0.

Правильновыражение if в !exists, которое является логическим выражением для сравнения exists со значением ноль.

Если exists имеет значение, не равное 0, вы записываете в файл, в противном случае выпропустите оператор записи.

Это то, что вы имели в виду.

Добавьте оператор fread вместо fscanf, чтобы проверить, существует ли заголовок в файле, который вы только что открыли.

Вы пишете в двоичном виде, поэтому тоже читаете в двоичном виде.

Настоящая проблема возникает, когда все простые проблемы устранены: файл, открытый для добавления, располагается в конце файла.

Используйте fseek для позиционирования указателя файла каждый раз, когда вы хотите прочитать заголовок или запись из файла.

Вот моя рабочая версия:

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
typedef struct hdr
{
  int file_size;
  char deleted;
  char file_name[256];
} Header;

const Header defaultHeader = {-10, 0, "CS3411 TAR"};

int main()
{
  //Open the main file, check if the main header exists
  FILE *fp;
  int exists = 0;
  fp = fopen("CS3411TAR.txt", "a+");
  if (!fp)
  {

    perror("Couldn't open file");
    return EXIT_FAILURE;
  }
  Header header;

  //Check if exists
  fseek(fp, 0, SEEK_SET);
  int bytesRead = fread(&header, sizeof(Header), 1, fp);
  printf("bytesRead: %d\n", bytesRead);
  if (bytesRead == 1)
  {
    printf("Header found!\n");
  }
  else
  {
    fseek(fp, 0, SEEK_SET);
    //file header DNE
    fwrite(&defaultHeader, sizeof(Header), 1, fp);

    printf("Header written.\n");
  }

  //To-Do  open file arguments names create headers and write

  fclose(fp);

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