<?xml version="1.0" encoding="koi8-r"?>
<rss version="0.91">
<channel>
    <title>OpenForum RSS: C/C++ 64bit. Глюк при сравнении чисел</title>
    <link>https://mobile.opennet.me/openforum/vsluhforumID9/7720.html</link>
    <description>Есть код на Си который загружает файл (большие 1,2,3 гигабайта) в память.&lt;br&gt;.....&lt;br&gt;char * buffer;&lt;br&gt;size_t lSize, result;&lt;br&gt;&lt;br&gt;pFile = fopen ( file , &quot;rb&quot; );&lt;br&gt;fseek (pFile , 0 , SEEK_END);&lt;br&gt;lSize = ftell (pFile);&lt;br&gt;rewind (pFile);&lt;br&gt;&lt;br&gt;buffer = (char*) malloc (sizeof(char)*lSize);&lt;br&gt;result = fread (buffer,1,lSize,pFile);&lt;br&gt;if ( result !=  lSize) &#123;fputs (&quot;Reading error&#092;n&quot;,stderr); &#125;&lt;br&gt;.....&lt;br&gt;&lt;br&gt;После загрузки, проверяю сколько было прочитано в память (result=fread)  с самим размером файла (lSize).&lt;br&gt;&lt;br&gt;Что получается, если размер файла до 2гиг, то if ( result !=  lSize) условие ИСТИНО, если больше 2 гиг то нет, хотя result и lSize всегда равны, смотрел через printf.&lt;br&gt;&lt;br&gt;И совсем как такое может быть, если в двух переменных одинаковые числа, а if говорит false?&lt;br&gt;&lt;br&gt;Кто знает как с этим бороться ?&lt;br&gt;Буду очень признателен за помощь!&lt;br&gt;&lt;br&gt;Система: FreeBSD 7.0-RELEASE-p5&lt;br&gt;gcc version 4.2.1 20070719 &lt;br&gt;</description>

<item>
    <title>C/C++ 64bit. Глюк при сравнении чисел (Michelnok)</title>
    <link>https://mobile.opennet.me/openforum/vsluhforumID9/7720.html#16</link>
    <pubDate>Fri, 28 Nov 2008 19:01:03 GMT</pubDate>
    <description>&amp;gt;&#091;оверквотинг удален&#093;&lt;br&gt;&amp;gt;        int ret; //ВНИМАНИЕ СЮДА &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;        FLOCKFILE(fp); &lt;br&gt;&amp;gt;        ret = __fread(buf, size, &lt;br&gt;&amp;gt;count, fp); &lt;br&gt;&amp;gt;        FUNLOCKFILE(fp); &lt;br&gt;&amp;gt;        return (ret); //ВНИМАНИЕ СЮДА &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;&#125; &lt;br&gt;&lt;br&gt;Ужас.&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>C/C++ 64bit. Глюк при сравнении чисел (yerdna)</title>
    <link>https://mobile.opennet.me/openforum/vsluhforumID9/7720.html#15</link>
    <pubDate>Fri, 28 Nov 2008 18:24:02 GMT</pubDate>
    <description>Наконец-то выяснил в чем проблема!) Конечно же не без вашей помощи, всем спасибо, особенно Michelnok и vic!!!&lt;br&gt;&lt;br&gt;Рассказываю в чем проблема:&lt;br&gt;&lt;br&gt;&amp;gt;Если это действительно сразу после fread (т.е. ты совсем ничего не делаешь &lt;br&gt;&amp;gt;с result), то похоже таки на ошибку в libc. Точнее, в &lt;br&gt;&amp;gt;твоей ее версии. &lt;br&gt;&lt;br&gt;После этого поста, я решил проверить, что же на самом деле делает fread.&lt;br&gt;Открыл /usr/src/lib/libc/stdio/fread.c и что я вижу&lt;br&gt;&lt;br&gt;.........&lt;br&gt;size_t&lt;br&gt;fread(void * __restrict buf, size_t size, size_t count, FILE * __restrict fp)&lt;br&gt;&#123;&lt;br&gt;        int ret; //ВНИМАНИЕ СЮДА&lt;br&gt;&lt;br&gt;        FLOCKFILE(fp);&lt;br&gt;        ret = __fread(buf, size, count, fp);&lt;br&gt;        FUNLOCKFILE(fp);&lt;br&gt;        return (ret); //ВНИМАНИЕ СЮДА&lt;br&gt;&#125;&lt;br&gt;&lt;br&gt;size_t&lt;br&gt;__fread(void * __restrict buf, size_t size, size_t count, FILE * __restrict fp)&lt;br&gt;&#123;&lt;br&gt;        size_t resid;&lt;br&gt;        char *p;&lt;br&gt;        int r; //ВНИМАНИЕ СЮДА&lt;br&gt;        size_t total;&lt;br&gt;&lt;br&gt;        /*&lt;br&gt;         * The ANSI standard requires a return value of 0 for a count&lt;br&gt;         * or a size of 0.  Peculiarily, it i</description>
</item>

<item>
    <title>C/C++ 64bit. Глюк при сравнении чисел (Michelnok)</title>
    <link>https://mobile.opennet.me/openforum/vsluhforumID9/7720.html#14</link>
    <pubDate>Fri, 28 Nov 2008 13:13:35 GMT</pubDate>
    <description>&amp;gt;&amp;gt;Переменные типа size_t выводи с форматом &#037;zu&lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;И при таком раскладе все тоже самое &lt;br&gt;&amp;gt;result = 18446744071619674112 &lt;br&gt;&lt;br&gt;Если это действительно сразу после fread (т.е. ты совсем ничего не делаешь с result), то похоже таки на ошибку в libc. Точнее, в твоей ее версии.&lt;br&gt;</description>
</item>

<item>
    <title>C/C++ 64bit. Глюк при сравнении чисел (Michelnok)</title>
    <link>https://mobile.opennet.me/openforum/vsluhforumID9/7720.html#13</link>
    <pubDate>Fri, 28 Nov 2008 13:03:11 GMT</pubDate>
    <description>&amp;gt; но могу посмотреть ман для фри выложенный на опеннет&lt;br&gt;&lt;br&gt;В этом отношении с FreeBSD хорошо:&lt;br&gt;http://www.freebsd.org/cgi/man.cgi&lt;br&gt;</description>
</item>

<item>
    <title>C/C++ 64bit. Глюк при сравнении чисел (vic)</title>
    <link>https://mobile.opennet.me/openforum/vsluhforumID9/7720.html#12</link>
    <pubDate>Fri, 28 Nov 2008 11:29:17 GMT</pubDate>
    <description>&amp;gt;&#091;оверквотинг удален&#093;&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;...&lt;br&gt;&amp;gt;&amp;gt;&amp;gt;lSize = ftell (pFile); &lt;br&gt;&amp;gt;&amp;gt;&lt;br&gt;&amp;gt;&amp;gt;Попробуй еще &lt;br&gt;&amp;gt;&amp;gt;&lt;br&gt;&amp;gt;&amp;gt;off_t lSize; &lt;br&gt;&amp;gt;&amp;gt;... &lt;br&gt;&amp;gt;&amp;gt;lSize = ftello (pFile); &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;Пробывал, ничего не изменилось. &lt;br&gt;&lt;br&gt;fseeko() &amp; ftello() одновременно, одного не достаточно (ессно с off_t). &lt;br&gt;&lt;br&gt;тип фс? для теста что будет если ручками в шелле создать файл &amp;gt;2GB и скопировать его?&lt;br&gt;&lt;br&gt;т.к. у вас фря, а у меня линукс, проверить я на коленке ничего не могу, но могу посмотреть ман для фри выложенный на опеннет, вижу что возвращаемое/устанавливаемое значение оффсета имеет тип long (возможно ман на опеннете безнадежно устарел), а не size_t. off_t судя по замечаниям в других манах (для lseek русский ман здесь же на опеннете) может быть int (4 byte, !8 byte), а lseek используется в fseek. Т.е. необходимо с файлами более 2 ГБ очень аккуратным. где-то все же ошибка у нас с вами, даже если кажется что считывается все вроде бы правильно...&lt;br&gt;&lt;br&gt;переменная errno после каждой операции проверяется?&lt;br&gt;</description>
</item>

<item>
    <title>C/C++ 64bit. Глюк при сравнении чисел (yerdna)</title>
    <link>https://mobile.opennet.me/openforum/vsluhforumID9/7720.html#11</link>
    <pubDate>Fri, 28 Nov 2008 09:05:12 GMT</pubDate>
    <description>&amp;gt;&amp;gt;size_t lSize, result; &lt;br&gt;&amp;gt;&amp;gt;...&lt;br&gt;&amp;gt;&amp;gt;lSize = ftell (pFile); &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;Попробуй еще &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;off_t lSize; &lt;br&gt;&amp;gt;... &lt;br&gt;&amp;gt;lSize = ftello (pFile); &lt;br&gt;&lt;br&gt;Пробывал, ничего не изменилось.&lt;br&gt;&lt;br&gt;&amp;gt;Количество считанных из файла байт потрясает. Дайте мне два таких винта :)&lt;br&gt;&amp;gt;Переменные типа size_t выводи с форматом &#037;zu&lt;br&gt;&lt;br&gt;И при таком раскладе все тоже самое &lt;br&gt;result = 18446744071619674112 &lt;br&gt;&lt;br&gt;&amp;gt;И включить -Wall чтобы gcc на printf() вываливал варнинг по поводу несоответствия &amp;gt;спецификатора и типа выводимого значения.&lt;br&gt;&lt;br&gt;Все соответствует, Wall молчит как рыба.&lt;br&gt;&lt;br&gt;----------&lt;br&gt;Повторюсь:&lt;br&gt;все работает так как надо, ошибки не выскакивают, то что я загрузил в память я потом с легкостью записываю обратно на винт, без всяких потерь данных.&lt;br&gt;Просто выскакивает такой глюк, если размер файла больше ~2гиг.&lt;br&gt;Единственный минус, так это то, что нельзя проверить сколько он считал.&lt;br&gt;Но как вариант я уже думаю просто форматировать result через sprintf c &#037;u.&lt;br&gt;&lt;br&gt;Кстати где-то вычитал, что feof() в таком месте не будет работать в любом случаи.&lt;br&gt;Весь инет обла</description>
</item>

<item>
    <title>C/C++ 64bit. Глюк при сравнении чисел (Michelnok)</title>
    <link>https://mobile.opennet.me/openforum/vsluhforumID9/7720.html#10</link>
    <pubDate>Fri, 28 Nov 2008 00:08:43 GMT</pubDate>
    <description>&amp;gt;&lt;br&gt;&amp;gt;Я забыл написать, что система у меня 64битная. (freebsd amd64) &lt;br&gt;&amp;gt;Сегодня когда выводил через printf числа, указал формат &#037;lu и вот что &lt;br&gt;&amp;gt;получилось &lt;br&gt;&amp;gt;lSize  = 2205089792 &lt;br&gt;&amp;gt;result = 18446744071619674112 &lt;br&gt;&amp;gt;а когда указываю формат &#037;u ,то в обеих 2205089792 &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;Может есть какие-то идеи? &lt;br&gt;&lt;br&gt;Количество считанных из файла байт потрясает. Дайте мне два таких винта :)&lt;br&gt;Переменные типа size_t выводи с форматом &#037;zu&lt;br&gt;</description>
</item>

<item>
    <title>C/C++ 64bit. Глюк при сравнении чисел (Michelnok)</title>
    <link>https://mobile.opennet.me/openforum/vsluhforumID9/7720.html#9</link>
    <pubDate>Thu, 27 Nov 2008 23:58:50 GMT</pubDate>
    <description>&amp;gt;size_t lSize, result; &lt;br&gt;&amp;gt;...&lt;br&gt;&amp;gt;lSize = ftell (pFile); &lt;br&gt;&lt;br&gt;Попробуй еще&lt;br&gt;&lt;br&gt;off_t lSize;&lt;br&gt;...&lt;br&gt;lSize = ftello (pFile);&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>C/C++ 64bit. Глюк при сравнении чисел (vic)</title>
    <link>https://mobile.opennet.me/openforum/vsluhforumID9/7720.html#8</link>
    <pubDate>Thu, 27 Nov 2008 11:40:11 GMT</pubDate>
    <description>&amp;gt;&amp;gt;&amp;gt;посмотреть sizeof(size_t), sizeof(off_t) &lt;br&gt;&amp;gt;&amp;gt;&amp;gt;а то если они 8 байт (так скорее всего и есть), то больше 2ГБ ну никак :) &lt;br&gt;&amp;gt;&amp;gt;&lt;br&gt;&amp;gt;&amp;gt;8589934592 GB математик хренов :) &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;в хренах именно столько &lt;br&gt;&lt;br&gt;в том смысле что если они не 8, а 4 байта, я ступил =)&lt;br&gt;&lt;br&gt;&lt;br&gt;</description>
</item>

</channel>
</rss>
