Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Программирование Новый топик    Ответить
 Считать из файла в С.  [new]
jenya7
Member

Откуда:
Сообщений: 770
Я должен прочитать из файла проверочную сумму, 8 байт
if (IsFileExists(checksum_file))
{
    FILE *file;
    char *checksum_buff = "";
    file = fopen(checksum_file, "r");
                            
    fread(checksum_buff, 8, 1, file);
    fclose(file);
}

один из аргументов fread функции - сколько байт прочитать. но байты могут быть записаны и со второй строчки. как задать считываемый размер?
14 ноя 17, 09:54    [20951458]     Ответить | Цитировать Сообщить модератору
 Re: Считать из файла в С.  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 16189
jenya7
байты могут быть записаны и со второй строчки
Когда читаешь БАЙТЫ, то нет никаких СТРОЧЕК.
14 ноя 17, 09:57    [20951469]     Ответить | Цитировать Сообщить модератору
 Re: Считать из файла в С.  [new]
jenya7
Member

Откуда:
Сообщений: 770
Akina
jenya7
байты могут быть записаны и со второй строчки
Когда читаешь БАЙТЫ, то нет никаких СТРОЧЕК.

а если читаю чары?
14 ноя 17, 09:59    [20951474]     Ответить | Цитировать Сообщить модератору
 Re: Считать из файла в С.  [new]
eNose
Member

Откуда: с ПТ
Сообщений: 178798
jenya7
Akina
пропущено...
Когда читаешь БАЙТЫ, то нет никаких СТРОЧЕК.

а если читаю чары?
их в любом случае нет.
строки - это форматирование.
14 ноя 17, 10:03    [20951491]     Ответить | Цитировать Сообщить модератору
 Re: Считать из файла в С.  [new]
Dima T
Member

Откуда:
Сообщений: 11427
Если надо читать построчно - используй fgets()
14 ноя 17, 10:03    [20951492]     Ответить | Цитировать Сообщить модератору
 Re: Считать из файла в С.  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 16189
jenya7
а если читаю чары?
Чары - это те же байты, только по-другому интерпретируемые.
14 ноя 17, 10:08    [20951515]     Ответить | Цитировать Сообщить модератору
 Re: Считать из файла в С.  [new]
jenya7
Member

Откуда:
Сообщений: 770
Dima T
Если надо читать построчно - используй fgets()

спасибо. то есть алгоритмика такая
читаю строчку - делаю trim на нее - если длина строки 8 - значит найдена нужная строка - сохраняю значение и выхожу.
я правильно понял?
14 ноя 17, 10:08    [20951517]     Ответить | Цитировать Сообщить модератору
 Re: Считать из файла в С.  [new]
jenya7
Member

Откуда:
Сообщений: 770
но кстати fgets() тоже имеет аргумен размер строки. а как задать размер?
14 ноя 17, 10:11    [20951529]     Ответить | Цитировать Сообщить модератору
 Re: Считать из файла в С.  [new]
eNose
Member

Откуда: с ПТ
Сообщений: 178798
jenya7
Dima T
Если надо читать построчно - используй fgets()

спасибо. то есть алгоритмика такая
читаю строчку - делаю trim на нее - если длина строки 8 - значит найдена нужная строка - сохраняю значение и выхожу.
я правильно понял?
а если непроверочная строка длиной 8 байт?
14 ноя 17, 10:11    [20951530]     Ответить | Цитировать Сообщить модератору
 Re: Считать из файла в С.  [new]
Dima T
Member

Откуда:
Сообщений: 11427
jenya7
Dima T
Если надо читать построчно - используй fgets()

спасибо. то есть алгоритмика такая
читаю строчку - делаю trim на нее - если длина строки 8 - значит найдена нужная строка - сохраняю значение и выхожу.
я правильно понял?

Все зависит от формата файла, который ты читаешь, т.е. вопрос надо задавать тому кто этот файл записал.
14 ноя 17, 10:11    [20951533]     Ответить | Цитировать Сообщить модератору
 Re: Считать из файла в С.  [new]
jenya7
Member

Откуда:
Сообщений: 770
eNose
jenya7
пропущено...

спасибо. то есть алгоритмика такая
читаю строчку - делаю trim на нее - если длина строки 8 - значит найдена нужная строка - сохраняю значение и выхожу.
я правильно понял?
а если непроверочная строка длиной 8 байт?

в файле по идее должно быть записанно только 8 байт - checksum пакета данных.
14 ноя 17, 10:12    [20951538]     Ответить | Цитировать Сообщить модератору
 Re: Считать из файла в С.  [new]
Dima T
Member

Откуда:
Сообщений: 11427
jenya7
но кстати fgets() тоже имеет аргумен размер строки. а как задать размер?

Это не размер строки, а размер буфера, в который читать. Если буфер будет меньше строки, то прочитается только часть, сколько влезет в буфер.
14 ноя 17, 10:14    [20951548]     Ответить | Цитировать Сообщить модератору
 Re: Считать из файла в С.  [new]
eNose
Member

Откуда: с ПТ
Сообщений: 178798
jenya7
eNose
пропущено...
а если непроверочная строка длиной 8 байт?

в файле по идее должно быть записанно только 8 байт - checksum пакета данных.
зачем тогда читать построчно?
читайте байты подряд и начиная со значимого (для вас) читайте 8.
14 ноя 17, 10:15    [20951552]     Ответить | Цитировать Сообщить модератору
 Re: Считать из файла в С.  [new]
jenya7
Member

Откуда:
Сообщений: 770
Dima T
jenya7
пропущено...

спасибо. то есть алгоритмика такая
читаю строчку - делаю trim на нее - если длина строки 8 - значит найдена нужная строка - сохраняю значение и выхожу.
я правильно понял?

Все зависит от формата файла, который ты читаешь, т.е. вопрос надо задавать тому кто этот файл записал.

файл обычный текстовой. в файле записанно только 8 байт - checksum пакета данных.
вопрос если я считываю построчно - как я знаю размер строки? в виде я могу открыть текстовый файл и растянуть его как угодно.
14 ноя 17, 10:15    [20951556]     Ответить | Цитировать Сообщить модератору
 Re: Считать из файла в С.  [new]
Dima T
Member

Откуда:
Сообщений: 11427
jenya7
Dima T
пропущено...

Все зависит от формата файла, который ты читаешь, т.е. вопрос надо задавать тому кто этот файл записал.

файл обычный текстовой. в файле записанно только 8 байт - checksum пакета данных.
вопрос если я считываю построчно - как я знаю размер строки? в виде я могу открыть текстовый файл и растянуть его как угодно.

Ничего не понимаю: если в файле ровно 8 байт и их надо прочитать, то откуда взялась вторая строка?

Длина прочитанной строки: strlen()
14 ноя 17, 10:23    [20951605]     Ответить | Цитировать Сообщить модератору
 Re: Считать из файла в С.  [new]
jenya7
Member

Откуда:
Сообщений: 770
Dima T
jenya7
пропущено...

файл обычный текстовой. в файле записанно только 8 байт - checksum пакета данных.
вопрос если я считываю построчно - как я знаю размер строки? в виде я могу открыть текстовый файл и растянуть его как угодно.

Ничего не понимаю: если в файле ровно 8 байт и их надо прочитать, то откуда взялась вторая строка?

Длина прочитанной строки: strlen()


человек открыл файл, нажал пару раз enter - позиция каретки не нулевая , и записал 8 байт.

а если так?
if (IsFileExists(checksum_file))
   {
       FILE *file = fopen(checksum_file, "r");
       char buff[1024];
       char c;
       int char_count = 0;
       int i = 0;
       
        while ((c = fgetc(file)) != EOF)
        {
            if (isalnum(c))
            {
                buff[i++] = (char) c;
                char_count++;
            }
            
            if (char_coun == 8)
               break;
        }

        buff[i] = '\0'; 
        
        fclose(file);
   }
14 ноя 17, 10:37    [20951651]     Ответить | Цитировать Сообщить модератору
 Re: Считать из файла в С.  [new]
Vladimir Baskakov
Member

Откуда:
Сообщений: 1686
а если человек между проверочными байтами смайлик нарисует, или в шутку напишет английскими буквами неприличное слово, что тогда?

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

имхо......
14 ноя 17, 10:45    [20951686]     Ответить | Цитировать Сообщить модератору
 Re: Считать из файла в С.  [new]
jenya7
Member

Откуда:
Сообщений: 770
Vladimir Baskakov
а если человек между проверочными байтами смайлик нарисует, или в шутку напишет английскими буквами неприличное слово, что тогда?

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

имхо......

я не делаю защиту от полных идиотов, их там по идее не допустят, но если рука дрогнула и сумма прописалась не с нулевой позиции - обычное дело.
14 ноя 17, 10:48    [20951696]     Ответить | Цитировать Сообщить модератору
 Re: Считать из файла в С.  [new]
jenya7
Member

Откуда:
Сообщений: 770
странно - у ьеня на строке while ((c = fgetc(file)) != EOF) ругается
Warning[Pe514]: pointless comparison of unsigned integer with a negative constant
char у меня в компиляторе знаковый.
14 ноя 17, 10:50    [20951704]     Ответить | Цитировать Сообщить модератору
 Re: Считать из файла в С.  [new]
Dima T
Member

Откуда:
Сообщений: 11427
Если задача стоит "где-то внутри файла есть 8 символов checksum", то можно и так.

Только я бы чуть поправил:
...
            if (isalnum(c))
            {
                buff[i++] = (char) c;
                char_count++;
            } else {
                char_count = 0;
                i = 0;
            }

Так прочитается только если 8 символов подряд.
И в конце не помешает проверить что прочитано 8.
Еще не помешает проверить что файл открылся.
И для buff 1024 многовато, достаточно 9 байт.
14 ноя 17, 10:51    [20951712]     Ответить | Цитировать Сообщить модератору
 Re: Считать из файла в С.  [new]
Dima T
Member

Откуда:
Сообщений: 11427
jenya7
странно - у ьеня на строке while ((c = fgetc(file)) != EOF) ругается
Warning[Pe514]: pointless comparison of unsigned integer with a negative constant
char у меня в компиляторе знаковый.

Потому что fgetc() возвращает int, т.е. надо
int c;
14 ноя 17, 10:53    [20951724]     Ответить | Цитировать Сообщить модератору
 Re: Считать из файла в С.  [new]
jenya7
Member

Откуда:
Сообщений: 770
Dima T
Если задача стоит "где-то внутри файла есть 8 символов checksum", то можно и так.

Только я бы чуть поправил:
...
            if (isalnum(c))
            {
                buff[i++] = (char) c;
                char_count++;
            } else {
                char_count = 0;
                i = 0;
            }

Так прочитается только если 8 символов подряд.
И в конце не помешает проверить что прочитано 8.
Еще не помешает проверить что файл открылся.
И для buff 1024 многовато, достаточно 9 байт.


спасибо. да так лучше.
а почему у меня на строке while ((c = fgetc(file)) != EOF) ругается
Warning[Pe514]: pointless comparison of unsigned integer with a negative constant
char у меня в компиляторе знаковый.
14 ноя 17, 10:54    [20951727]     Ответить | Цитировать Сообщить модератору
 Re: Считать из файла в С.  [new]
jenya7
Member

Откуда:
Сообщений: 770
Dima T
jenya7
странно - у ьеня на строке while ((c = fgetc(file)) != EOF) ругается
Warning[Pe514]: pointless comparison of unsigned integer with a negative constant
char у меня в компиляторе знаковый.

Потому что fgetc() возвращает int, т.е. надо
int c;

спасибо. понял.
14 ноя 17, 10:56    [20951736]     Ответить | Цитировать Сообщить модератору
Все форумы / Программирование Ответить