Подключить файл
Подключаю файл с функцией создания и заполнения бинарного файла, также надо чтобы открывался поток для открытия файла в 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 шт):
Начнем с мелочи — вообще-то .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);
}