Подключить файл

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

main.c

#include <stdio.h>
#include <stdlib.h>
#include "create.c"

void ReadFile(FILE* f)
{
    int data;
    while ( fread(&data, sizeof( int ), 1, f ) >= 1) {
        printf("%d ", data);
    }
    printf("\n\n");
}

int DeleteNum(FILE* f, char * file_name) {
    char tmpfile[]="tmpf";
    int data, cnt=0;
    FILE * tmpf;
    while ( fread(&data, sizeof( int ), 1, f ) >= 1) {
        if (data<0) {
            fwrite(&data, sizeof( int ), 1, tmpf);
        } else cnt++;
    }
    fclose(f);
    fclose(tmpf);
    remove(file_name);
    rename(tmpfile, file_name);
    return cnt;
}

int main(int argc, char *argv[]) {
    int n;
    char file[15];
    if(argc<3){
        puts("file name:");
        if(!fgets(file, 15, stdin)) { 
            return 1; 
        }
        file[strlen(file) - 1] = 0;
    } else {
        strcpy(file,argv[1]);
    }
    FILE * f ; // = fopen(file, "wb")
    CreateBinFile(file);
    ReadFile(f);
    n=DeleteNum(f, file);
    ReadFile(f);
    printf("%d\n", n);
    return 0;
}

create.c

#ifndef create
#define create

void CreateBinFile(char* name_file) { // FILE* f / char* name_file
    int n = 100;
    int data;
    FILE* f = fopen(name_file, "wb");
    srand(time(NULL));
    for (int i = 1; i <= n; i++)
    {
        data = rand() % 100 - 50;
        fwrite(&data, sizeof(int), 1, f);
    }
}

#endif

Ответы (1 шт):

Автор решения: Harry

Начнем с мелочи — вообще-то .c-файлы не предусмотрены для включения через #include.

По делу... У вас везде передается не имя файла, а сам открытый файл, который вы в каждой функции закрываете, а потом пытаетесь работать с ним — уже закрытым...

Даже передаваемый как аргумент файл тут же перекрывается переменной с тем же именем в функции.

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

Словом, ошибок очень много.

Если бы вы указали точное задание, можно было бы пытаться вам помочь с кодом, а так — просто непонятно, что именно писать, так как это зависит от того, что надо сделать... А об этом вы ни слова не сказали.

Update

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

void CreateBinFile(const char * name_file)
{
    const int n = 100;
    FILE* f = fopen(name_file, "wb");
    if (!f)
    {
        puts("Error create file");
        exit(1);
    }
    srand(time(NULL));
    for(int i = 1; i <= n; i++)
    {
        int data = rand() % 100 - 50;
        fwrite(&data, sizeof(int), 1, f);
    }
    fclose (f);
}

void ReadFile(const char * name) // char * file_name
{
    int data;
    FILE* f = fopen(name, "rb");
    if (!f)
    {
        puts("Error read file");
        exit(1);
    }

    while(fread(&data,sizeof(int),1,f) == 1)
    {
        printf("%d ", data);
    }
    printf("\n\n");
    fclose(f);
}

int DeleteNum(char * name)
{
    const char * tmpfile = "temp";
    FILE * f    = fopen(name, "rb");
    FILE * tmpf = fopen(tmpfile, "wb");
    if (!f || !tmpf)
    {
        puts("Error open file while delete");
        exit(1);
    }
    int cnt = 0;
    for(int data; fread(&data, sizeof( int ), 1, f) == 1;)
        if (data >= 0)
            fwrite(&data, sizeof( int ), 1, tmpf);
        else
            cnt++;

    fwrite(&cnt, sizeof( int ), 1, tmpf);

    fclose(f);
    fclose(tmpf);

    remove(name);
    rename(tmpfile, name);

    return cnt;
}

int main(int argc, char *argv[])
{
    char file[15];
    if(argc < 3)
    {
        puts("name file:");
        if (!fgets(file, 15, stdin))
            return 1;
    } else {
        strcpy(file,argv[1]);
    }
    if (file[strlen(file)-1] == '\n')
        file[strlen(file)-1] = 0;

    CreateBinFile(file);

    ReadFile(file);

    int n = DeleteNum(file);

    ReadFile(file);

    printf("Deleted %d numbers\n", n);

}
→ Ссылка