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

C++

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

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

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

Баг asio? или баг TCP стека? - C++
всем привет. повстречался с очень странным багом. и не могу определить кто бажит, asio, или TCP-стек. на стороне клиента,...

Fread(), fseek(), fwrite() - Переписка байтов - C++
Всем привет. Такой вопрос. Есть задача пройтись по бинарному файлу с вещественными числами и как-то изменить его элементы, пусть будет,...

VMWARE и QUDPSOCKET: при использовании виртуальной машины, приложение не получает пакеты - C++
Всем доброго времени суток. Решил затестить свое приложение, которое использует мульткаст, но столкнулся с такой проблемой - при...

Ошибка "Signal received" при использовании taglib - C++
Когда пытаюсь вывести id3v2-&gt;artist(или любое другое ), вне функции где инициализировал id3v2, вылетает signal received;(библиотека taglib)...

Ошибка при использовании класса - C++ Builder
Решил написать чат. Написал маленький класс сервера: class ServChat { private: unsigned int unNumber; unsigned int umNumber; ...

Ошибка при использовании TServerSocket - C++ Builder
Здраствуйте, у меня в проекте 2 формы на первой форме есть TServerSocket при отправке текста таким образом ...

4
Alchem
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
Alchem
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
odip
Эксперт С++
7157 / 3219 / 59
Регистрация: 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
Alchem
0 / 0 / 0
Регистрация: 23.09.2009
Сообщений: 10
24.09.2009, 20:21  [ТС] #5
1) Я просто поленился в тестовом коде делать проверки на все возможные ошибки
2) А вот тут действительно ошибся. Думал fwrite и fread автоматически пишут и читают в binary mode.

Спасибо за помощь. Два дня тупил, не мог понять в чем ошибка.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.09.2009, 20:21
Привет! Вот еще темы с ответами:

Warning-и при использовании CSpinEdit - C++ Builder
Доброе всем время суток, дамы и господа... Работаю в RAD XE3 и столкнулся с такой вот непоняткой: на форму бросаю компонент CSpinEdit...

Ошибка при использовании парсера - C++ Builder
Нашёл статью: http://www.rsdn.ru/article/files/Classes/tparser.xml Там есть пример использования парсера. НО при попытке...

Ошибка при использовании MsiEnumProducts - C++ Builder
Всем Добрый вечер. Ребята проблема такая, написал код, но при компиляции выдает ошибки msi.h(776): E2015 Ambiguity between 'PHKEY'...

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


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

Или воспользуйтесь поиском по форуму:
5
Yandex
Объявления
24.09.2009, 20:21
Ответ Создать тему
Опции темы

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