0 / 0 / 0
Регистрация: 23.09.2009
Сообщений: 10
1

Баг в MinGW при использовании fread

23.09.2009, 15:58. Показов 2479. Ответов 4
Метки нет (Все метки)

Ну собственно вот простой тестовый код который выполняется некорректно:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <cstdio>
using namespace std;
 
const int N = 2500;
 
int main()
{
    int *array = new int[N];
    for(int i = 0 ; i<N ; i++)
        array[i] = i;
    
    FILE *pfile;
    pfile = fopen("data1.dat", "w");
    fwrite(array , sizeof(int) , N ,pfile);
    fclose(pfile);
    
    pfile = fopen("data1.dat","r");
    int *array2 = new int[N];
    fread(array2 , sizeof(int) , N ,pfile);
    fclose(pfile);
    
    bool readError = false;
    for(int i = 0 ; i<N ; i++)
    {
        if(array[i] != array2[i]) readError = true;
    }
    if(readError) 
        printf("error");
    else 
        printf("all right");
    delete [] array;
    delete [] array2;
}
Массив забиваем числами, записываем в файл, читаем содержимое файла в другой массив, потом сравниваем массивы и они не совпадают. Если поставить размер массива поменьше, скажем 1000 , то все работает нормально. Под линуксом все выполняется нормально, проблемы возникают только в mingw.

mingw из бинарников следующих версий:
binutils-2.19.1-mingw32-bin
gcc-c++-4.4.0-mingw32-bin
gcc-core-4.4.0-mingw32-bin
gmp-4.2.4-mingw32-dll
make-3.81-20090914-mingw32-bin
mingwrt-3.16-mingw32-dev
mingwrt-3.16-mingw32-dll
mpfr-2.4.1-mingw32-dll
w32api-3.13-mingw32-dev

Подскажите, это косяк mingw или я гдето туплю?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.09.2009, 15:58
Ответы с готовыми решениями:

Баг при использовании функции библиотеки
Код C++ 1 curl_global_init(CURL_GLOBAL_WIN32); // - выдаёт такую ошибку : error LNK2019: ссылка...

Баг при использовании класса string при записи в бинарный файл
При записи в бинарный файл пользовательского класса, всё отлично отрабатывает, но, если в классе...

Может ли MinGW x64 компилить приложения x32? Или нужно для этого отдельно ещё MinGW х32 качать?
Просто решил поиграться с CodeLite.

Mingw-w64 MinGW TDM-GCC
Всем привет. Хочу понять, существует ли принципиальная разница между Mingw-w64, MinGW и...

4
0 / 0 / 0
Регистрация: 23.09.2009
Сообщений: 10
24.09.2009, 06:42  [ТС] 2
Поставил Visual C++ 2008 Express Edition и попробовал скомпилить с помощью него. Косяк остался, но при компиляции вылетело предупреждение:

warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

поменял fopen на fopen_s, все равно не помогло ((
0
0 / 0 / 0
Регистрация: 23.09.2009
Сообщений: 10
24.09.2009, 11:09  [ТС] 3
Переписал прогу с использованием класса fstream:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <fstream>
#include <iostream>
using namespace std;
 
const int N = 5000;
 
int main()
{
    double *array = new double[N];
    double *array2 = new double[N];
    
    for(int i = 0 ; i<N ; i++)
        array[i] = i;            
    
    fstream outfile("data1.dat", fstream::binary | fstream::out);
    outfile.write((char*)array , sizeof(double)*N);
    outfile.close();
    
    outfile.open("data1.dat", fstream::binary | fstream::in);   
    outfile.read((char*)array2 , sizeof(double)*N);
    outfile.close();
    
    bool readError = false;
    for(int i = 0 ; i<N ; i++)
    {
        if(array[i] != array2[i]) readError = true;
    }
    if(readError) 
        printf("error");                        
    else 
        printf("all right");
    delete [] array;
    delete [] array2;
}
Вот теперь все работает. Остается непонятным факт, что при использовании fwrite и fread массивы не совпадают. Вроде это стандартные функции C которые должны работать на любых операционках и платформах.
0
Эксперт С++
7175 / 3234 / 80
Регистрация: 17.06.2009
Сообщений: 14,164
24.09.2009, 19:33 4
1) Нужно проверять на наличие ошибки во всех функция которые могут вернуть ошибку !
2) Ты забыл что файл нужно открывать в binary mode.
Вот тебе на 1000000 элементов - все работает.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <cstdio>
#include <stdlib.h>
 
using namespace std;
 
const int N = 1000000;
 
int main()
{
        int retcode;
    
        int *array = new int[N];
        for(int i = 0 ; i<N ; i++)
                array[i] = i;
        
        FILE *pfile;
        pfile = fopen("data1.dat", "wb");
        if ( pfile == NULL ) {
            fprintf( stderr, "err open1\n" );
            exit( 1 );
        }
        retcode= fwrite(array , sizeof(int) , N ,pfile);
        printf( "retcode=%d\n", retcode );
        if ( retcode != N ) {
            fprintf( stderr, "err read1\n" );
            exit( 1 );
        }
        fclose(pfile);
        
        pfile = fopen("data1.dat","rb");
        if ( pfile == NULL ) {
            fprintf( stderr, "err open2\n" );
            exit( 1 );
        }
        int *array2 = new int[N];
        retcode= fread(array2 , sizeof(int) , N ,pfile);
        printf( "retcode=%d\n", retcode );
        if ( retcode != N ) {
            fprintf( stderr, "err read2\n" );
            exit( 1 );
        }
        fclose(pfile);
        
        bool readError = false;
        for(int i = 0 ; i<N ; i++)
        {
                if(array[i] != array2[i]) readError = true;
        }
        if(readError) 
                printf("error");
        else 
                printf("all right");
        delete [] array;
        delete [] array2;
}
1
0 / 0 / 0
Регистрация: 23.09.2009
Сообщений: 10
24.09.2009, 20:21  [ТС] 5
1) Я просто поленился в тестовом коде делать проверки на все возможные ошибки
2) А вот тут действительно ошибся. Думал fwrite и fread автоматически пишут и читают в binary mode.

Спасибо за помощь. Два дня тупил, не мог понять в чем ошибка.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.09.2009, 20:21
Помогаю со студенческими работами здесь

Я нашёл баг компилятора g++ 4.6.2 в mingw, куда можно об этом написать?
чтобы исправили?

Мистический баг при использовании ООП в IAR
Решил попробовать ООП в коде для ATxmega128A1 в IAR и столкнулся с каким-то необъяснимым багом....

MinGW, при установке ошибка: unpacking mingw-get-0.6.2-mingw32-beta-20131004-1-bin.tar.xz
Добрый день, форумчане! Недавно начал изучать Си, решил попрактиковаться. В качестве компилятора не...

Ошибка Warning: fread() [function.fread]: Length parameter must be greater than 0
Есть строка кода if(!preg_match('/'.$user.&quot;/&quot;,fread($fusers,filesize(&quot;user/users.txt&quot;))) &amp;&amp;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru