Процент файла C. Как исправить размеры, чтобы остаться в пределах? - PullRequest
0 голосов
/ 01 мая 2019

Я пытаюсь прочитать файл на C и сделать несколько загрузочных отпечатков, которые покажут мне, сколько файлов я прочитал до сих пор (я читаю файл кусками).Моя проблема в том, что когда дело доходит до файлов большего размера (> 100 МБ), загрузка падает, и я знаю, что это потому, что существуют ограничения для типов данных в C, но я не знаю, как это исправить или как к нему подойти.

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

FILE *file;
file = fopen("test.txt", "r");
size_t nread;
char * buf  = (char*)malloc(sizeof(char) * CHUNK);
long total = 0;
fseek(file, 0L, SEEK_END);
total = ftell(file);
fseek(file, 0L, SEEK_SET);

if (file)
    {
    while ((nread = fread(buf, 1, CHUNK, file)) > 0)
        {
                printf(" loading: %d \n", ftell(file)*100/total);
        }
    }

fclose(file);

Проблема в размерах в C, так как файлы больше, чем предельные значения int / long int, они переполняются, есть ли способ правильно отобразить, сколько файлов яразобрали?Я не могу сохранить результат "ftell (file) * 100 / total" в int или long int.

1 Ответ

0 голосов
/ 02 мая 2019

Проблема с типами данных. Ответ заключался в том, чтобы использовать вместо типа данных int тип данных unsigned long long int для вычисления процента.

FILE *file;
file = fopen("test.txt", "r");
size_t nread;
char * buf  = (char*)malloc(sizeof(char) * CHUNK);
unsigned long long total = 0, keeptrack_sum, percentage;
fseek(file, 0L, SEEK_END);
total = ftell(file);
fseek(file, 0L, SEEK_SET);

if (file)
    {
    while ((nread = fread(buf, 1, CHUNK, file)) > 0)
        {

           keeptrack_sum += nread;
           percentage = keeptrack_sum*100/total
           printf(" loading: %d \n", percentage);
        }
    }

fclose(file);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...