有一个函数可以创建一个带有数字的二进制文件并从中读取。此外,还有一个函数,用于从可变数量的二进制文件中读取数字,将它们合并为一个,并返回一个指向包含该文件名称的字符串的指针。(Load_data) 问题是从二进制文件读取的函数拒绝从Load_data 函数返回的名称的文件中读取数据。
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <windows.h>
#include <stdarg.h>
#include <conio.h>
#include "functions.h"
#include "vnsort_bin_dec.h"
#include "vnsort_bin_inc.h"
#include <string.h>
#include <stdio.h>
#define N 20
using namespace std;
char* Load_data(const char* path, ...)
{
int i = 0, t;
char *str = new char[N];
FILE* f, *a;
va_list path_ptr; //Объявление списка переменных аргументов
const char* path_tmp = path; // инициализация указателя
va_start(path_ptr, path); // инициализация списка переменных аргументов
// создание файла
puts("Введите имя файла!");
gets_s(str, N);
if ((a = fopen((char*)str, "wb")) == NULL)
{
printf("\n Файл %s не открывается", a);
system("pause");
//return;
}
else
{
do
{
f = fopen(path_tmp, "rb");
fseek(f, 0L, 0);
while (fread(&t, sizeof(int), 1, f))
{
// записываем все числа в один файл
fwrite(&t, sizeof(int), 1, a);
if (feof(f)) break;
i++;
}
path_tmp = va_arg(path_ptr, const char*);
} while (path_tmp);
}
puts("Данные загружены!");
return str;
}
int creat_bin(char *a) // создание файла данных, ввод чисел с клавиатуры
{
FILE* A;
int n;
if ((A = fopen(a, "wb")) == NULL)
{
printf("\n Файл %s не открывается", a);
system("pause");
return -1;
}
else
{
printf("\n Введите %d целых чисел: ", 5);
for (size_t i = 0; i < 5; i++)
{
scanf_s("%d", &n);
fwrite(&n, sizeof(int), 1, A);
}
fclose(A);
}
}
int read_bin(char* a) // чтение файла данных
{
FILE* A;
int n;
if ((A = fopen(a, "rb")) == NULL)
{
printf("\n Файл %s не открывается", a);
system("pause");
return -1;
}
else
{
//fseek(A, 0L, 0);
while (fread(&n, sizeof(int), 1, A))
cout << n << " ";
fclose(A);
}
}
int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
char *str;
str = Load_data("t1", "t2", NULL);
read_bin(str);
return 0;
}
忘记关闭函数中
f
的文件。输入/输出被缓冲,因此数据不包括在内。a
Load_data()
a
他们也
return
忘记了int creat_bin()
和功能int read_bin()
。