Как можно реализовать чтение числа из файла?
Есть файл с числами. В нем последовательность из чисел. Например, 97 , 98 и 97, 99, 256 ... записанных подряд, то есть так:
97989799256...
Все числа имеют тип int, они были записаны в файл с помощью функции fprintf(file, "%d", число);
Можно ли корректно прочесть их в буфер не добавляя разделительные знаки между числами? Возможно, читать из файла по 4 байта? Какие функции для этого подошли бы? Я пробую прочесть одно число через freadи вывести его на экран, но почему-то программа вылетает. Вот мой код:
FILE* outFile;
outFile = fopen (outputFileName, "w");
FILE* inFile;
inFile = fopen (inputFileName, "rb");
while (feof(inFile)!=0){
int * buffer = checkNull(malloc(1*sizeof(int)));
fread (buffer, 4, 1, inFile);
printf("%d", buffer);
}
fclose(inFile);
fclose(outFile);
У меня был текстовый файл со строкой abacabadabacabae [из примера][1] на первом шаге кодирования я прочел из файла букву а, которая была в словаре, затем b последовательность символов ab занес в словарь с кодом 256, а код символа а (97) занес в файл с числами. Далее к b конкатенировал a, занес ba в словарь с кодом 257, а b (98) в файл с числами. Теперь когда я встречу в файле числа 256 и 257 я буду знать, что они представляют собой ab и ba, но как их корректно прочесть?
[1]: https://habr.com/ru/post/132683/#:~:text=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%20LZW,Jacob%20Ziv)%20%D0%B2%201978%20%D0%B3.
Ответы (1 шт):
А что вам мешает писать int бинарно по 4 байта ну или по sizeof(int)? Ну а потом читать по 4 байта как вы и писали
Вот пример
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
int dump(int* arr, unsigned int size, char* file_name)
{
if (!size || !arr)
{
return 1;
}
FILE *fptr;
fptr=fopen(file_name, "wb");
if (!fptr)
{
fprintf(stderr, "Unable to open file!\n");
return 2;
}
fwrite(arr, sizeof(arr[0]), size, fptr);
fclose(fptr);
return 0;
}
int FileExist(char *filename)
{
struct stat st;
int result = stat(filename, &st);
if (result != 0)
{
printf("File not found %s\n", filename);
return 1;
}
return 0;
}
long int GetFileSize(char* file_name)
{
FILE *source;
source=fopen(file_name, "rb");
if (source == NULL)
{
printf("Error take file size\n");
return 1;
}
fseek(source, 0, SEEK_END);
long int source_size = ftell(source);
fseek(source, 0, SEEK_SET);
fclose(source);
return source_size;
}
typedef struct _pview {
void* _ptr;
size_t _size;
} _pview;
_pview read(char *filename)
{
_pview ret;
ret._ptr = NULL;
if (FileExist(filename))
{
return ret;
}
FILE *fptr;
fptr=fopen(filename, "rb");
if (!fptr)
{
fprintf(stderr, "Unable to open file!\n");
return ret;
}
long int size = GetFileSize(filename);
size_t arr_size = (size_t)size / sizeof(int);
ret._ptr = (int*)malloc((size_t)size);
if (!ret._ptr)
{
return ret;
}
fread(ret._ptr, sizeof(int), arr_size, fptr);
fclose(fptr);
ret._size = size;
return ret;
}
int main()
{
int arr[] ={10, 20, 123, 2134, 14};
unsigned int arr_size = sizeof(arr) / sizeof(arr[0]);
int ret = dump(arr, arr_size, "dump.bin");
if (ret)
{
fprintf(stderr, "Error!\n");
return ret;
}
_pview data = read("dump.bin");
if (!data._ptr)
{
fprintf(stderr, "Error!\n");
return 1;
}
for (int i = 0; i < data._size / sizeof(int); ++i)
{
fprintf(stdout, "%d\n", ((int*)data._ptr)[i]);
}
if (data._ptr)
{
free(data._ptr);
}
return 0;
}