Помните, что для выражения 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;
}