Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.92
Alchem
0 / 0 / 0
Регистрация: 23.09.2009
Сообщений: 10
23.09.2009, 15:58     Баг в MinGW при использовании fread #1
Ну собственно вот простой тестовый код который выполняется некорректно:

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 или я гдето туплю?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.09.2009, 15:58     Баг в MinGW при использовании fread
Посмотрите здесь:

Баг asio? или баг TCP стека? C++
C++ При использовании оператора GOTO зацикливается программа при введении букв.
баг при вызове функции(сеть) C++
Visual C++ баг при использовании функции библиотеки
C++ Ошибка на компиляторе MinGW при сборке структуры
Я нашёл баг компилятора g++ 4.6.2 в mingw, куда можно об этом написать?
C++ std::regex : баг на сайте или баг компилятора?
Ошибка при использовании openfilename: Нарушение прав доступа при записи по адресу Visual C++
При использовании getline ввод при Enter заканчивается только после пробела C++
C++ Mingw-w64 MinGW TDM-GCC
Баг при работе с строками C++
Ошибки при компиляции библиотеки через MinGW

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Alchem
0 / 0 / 0
Регистрация: 23.09.2009
Сообщений: 10
24.09.2009, 06:42  [ТС]     Баг в MinGW при использовании fread #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, все равно не помогло ((
Alchem
0 / 0 / 0
Регистрация: 23.09.2009
Сообщений: 10
24.09.2009, 11:09  [ТС]     Баг в MinGW при использовании fread #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 которые должны работать на любых операционках и платформах.
odip
Эксперт C++
 Аватар для odip
7226 / 3288 / 59
Регистрация: 17.06.2009
Сообщений: 14,165
24.09.2009, 19:33     Баг в MinGW при использовании fread #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;
}
Alchem
0 / 0 / 0
Регистрация: 23.09.2009
Сообщений: 10
24.09.2009, 20:21  [ТС]     Баг в MinGW при использовании fread #5
1) Я просто поленился в тестовом коде делать проверки на все возможные ошибки
2) А вот тут действительно ошибся. Думал fwrite и fread автоматически пишут и читают в binary mode.

Спасибо за помощь. Два дня тупил, не мог понять в чем ошибка.
Yandex
Объявления
24.09.2009, 20:21     Баг в MinGW при использовании fread
Ответ Создать тему
Опции темы

Текущее время: 00:30. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru