Как определить, есть ли данные в файле C File Handling - PullRequest
0 голосов
/ 31 января 2019

Я очень новичок в обработке файлов в C. Я хотел бы спросить, есть ли какой-нибудь способ, которым я мог бы обнаружить, существуют ли данные в файле.Потому что если его нет, я буду использовать "wb", но если данные уже есть, я просто использую append "ab".

Я пытался использовать "wb" вместо "ab" при записи данных, но первые данные, которые я написал, не будут прочитаны.

Вот пример:

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

struct clientInfo{
    char Name[30];
};

void inputAccounts();
void viewAllRecords();

int main()
{
    showOptions();
}

void inputData()
{
    FILE *fp;

    fp = fopen("hello", "ab");

    struct clientInfo PERSONAL;

    if(fp == NULL)
    {
        printf("Error!!!");
        getch();
    }
    else
    {
        fflush(stdin);
        printf("Enter Name: ");
        gets(PERSONAL.Name);

        fwrite((char *)&PERSONAL, sizeof(struct clientInfo), 1, fp);

        printf("File Created!!!");
        getch();
        fclose(fp);
    }
}

void showOptions()
{
    char choice;
    system("cls");
    printf("\n[1] Add Accounts");
    printf("\n[2] View Records");
    choice = getch();
    if (choice == '1')
    {
        inputData();
    }
    else if (choice == '2')
    {
        viewAllRecords();
    }
    showOptions();
}

void viewAllRecords()
{
    FILE *fp;
    fp = fopen("hello", "rb");

    struct clientInfo PERSONAL;

    fread((char *)&PERSONAL, sizeof(struct clientInfo), 1, fp);

    system("cls");
    if(fp == NULL){
        printf("Error!!!");
        getch();
    }
    else
    {
        while((fread((char *)&PERSONAL, sizeof(struct clientInfo), 1, fp))==1)
        {
            printf("Name: %s\n", PERSONAL.Name);
        }
    }
    getchar();
}

Ответы [ 3 ]

0 голосов
/ 31 января 2019

Просто используйте ab в обоих случаях.

Если файл уже существует, он откроет файл, и запись начнется с конца файла.

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

С http://man7.org/linux/man-pages/man3/fopen.3.html:

   a      Open for appending (writing at end of file).  The file is
          created if it does not exist.  The stream is positioned at the
          end of the file.

РЕДАКТИРОВАТЬ

Поскольку OP опубликовал больше кода, онвидно, что первая запись никогда не будет напечатана:

struct clientInfo PERSONAL;

fread((char *)&PERSONAL, sizeof(struct clientInfo), 1, fp);
^^^^^^^
Read but there is no print

system("cls");
if(fp == NULL){
    printf("Error!!!");
    getch();
}
else
{
    while((fread((char *)&PERSONAL, sizeof(struct clientInfo), 1, fp))==1)
    {
        printf("Name: %s\n", PERSONAL.Name);
    }
}

решение простое - просто удалите это fread, чтобы fread выполнялось только в цикле while.

Другие советы:

Для gets см. Почему функция get так опасна, что ее не следует использовать?

Для fflush(stdin); см. Использование fflush (stdin)

0 голосов
/ 31 января 2019

Стандартная библиотека также предоставляет функции stat и fstat, которые позволяют вам заполнить struct stat для непосредственного определения размера файла.stat принимает путь к файлу и указатель на stuct stat (объявлено с автоматическим хранением - это нормально), а fstat принимает целочисленный дескриптор файла в качестве аргумента.

Использование stat дляопределить, является ли размер файла больше нуля, достаточно просто вызвать stat и затем проверить элемент структуры .st_size.

При соответствующей проверке вы можете сделать:

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

#define MAXC 1024

int main (void) {

    char fn[MAXC];      /* filename */
    struct stat sbuf;   /* stat buffer */
    FILE *fp;

    /* prompt, read filename, trim line-end */
    fputs ("enter filename: ", stdout);
    if (!fgets (fn, MAXC, stdin)) {
        fputs ("(user canceled input)\n", stderr);
        return 1;
    }
    fn[strcspn (fn, "\r\n")] = 0;

    /* call stat, fill stat buffer, validate success */
    if (stat (fn, &sbuf) == -1) {
        perror ("error-stat");
        return 1;
    }

    /* test sbuf.st_size to check if file size > 0 */
    if (sbuf.st_size > 0) {
        puts ("opened ab");
        fp = fopen (fn, "ab");
    }
    else {
        puts ("opened wb");
        fp = fopen (fn, "wb");
    }
    /* rest of code... */
}

В любом случае, используя seek или stat, вы можете определить, что вам нужно.

0 голосов
/ 31 января 2019

Вы можете использовать fseek(), чтобы выполнить свою задачу.fseek() используется для перемещения указателя файла, связанного с данным файлом, в определенную позицию.

FILE *fp;
fp = fopen("test.txt", "r");
// Moving pointer to end
fseek(fp, 0, SEEK_END);
if(ftell(fp)>0){
    printf("data exists on the file.\n");
}else{
    printf("no data.\n");
}

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

...