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

Поиск ошибки в fread - C++

Восстановить пароль Регистрация
 
Anwer
 Аватар для Anwer
0 / 0 / 0
Регистрация: 02.01.2014
Сообщений: 49
30.05.2014, 19:25     Поиск ошибки в fread #1
У меня возникла ошибка. Мне нужно прочесть данные с бинарных файлов. Бинарный файл "a.dat" содержит в себе числа '7 0 1 0 1 0 1 0 2 6 2', но по какой-то причине выводит только 7 символ, при попытки изменить fread(&d, sizeof(d), 1, f1); вылазит Stack around the variable 'd' was corrupted.
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
#include <iostream> 
using namespace std;
 
int main ()
{
    setlocale(LC_ALL, "RUS");
    FILE *f1, *f2, *f3;
    f1 = fopen("a.dat", "rb"); // открываю файл a.dat
    if ((f1 = fopen("a.dat", "rb")) == NULL) // ошибка открытия
    {    
        cout << "Невозможно открыть файл." << endl;
    }
    else
        cout << "Файл 'a.dat' успешно открыт и готов к чтению!" << endl;
    f2 = fopen("b.dat", "rb"); // открываю файл b.dat
    if ((f2 = fopen("b.dat", "rb")) == NULL) // ошибка открытия
    {    
        cout << "Невозможно открыть файл." << endl;
    }
    else
        cout << "Файл 'b.dat' успешно открыт и готов к чтению!" << endl;
    f3 = fopen("c.dat", "wb"); // открываю файл c.dat
    char d;
    fread(&d, sizeof(d), 1, f1);
    cout << d  << endl;
    int fclose (char *f1);
    int fclose (char *f2);
    int fclose (char *f3);
    system("pause");
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.05.2014, 19:25     Поиск ошибки в fread
Посмотрите здесь:

C++ fread
C++ Поиск ошибки в коде
C++ Поиск ошибки
C++ Поиск ошибки.
C++ Поиск ошибки в программе.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
30.05.2014, 19:33     Поиск ошибки в fread #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Anwer Посмотреть сообщение
при попытки изменить fread(&d, sizeof(d), 1, f1);
при попытке изменить... что?
количество символов?
Ну правильно! в одну переменную типа char можно считать лишь один символ(байт)!
Anwer
 Аватар для Anwer
0 / 0 / 0
Регистрация: 02.01.2014
Сообщений: 49
30.05.2014, 20:34  [ТС]     Поиск ошибки в fread #3
Тогда как мне прочесть нормально "a.dat" ? Что бы '7 0 1 0 1 0 1 0 2 6 2' из файла "a.dat" были помещены в переменную d?
yalim
0 / 0 / 1
Регистрация: 22.05.2014
Сообщений: 4
30.05.2014, 20:52     Поиск ошибки в fread #4
см документацию:
size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
первым параметром идет указатель на переменную, вторым количество байт, которые необходимо считать из файла. Таким образом, в вашем случае сначала надо выделить (например, с помощью функции calloc или malloc) кусок памяти длиной NN (байт, в переменной d сохранить указатель на этот кусок.
вместо строк 23-24:
C
1
2
3
4
5
int numOfBytesToRead  = 50;
char* d =  malloc (numOfBytesToRead);
fread(d,sizeof(char),NN,f1);
//разыменовываем d, делаем с ним что-то
free(d);
Anwer
 Аватар для Anwer
0 / 0 / 0
Регистрация: 02.01.2014
Сообщений: 49
30.05.2014, 21:07  [ТС]     Поиск ошибки в fread #5
Не получилось, скрин ошибок выложил. Поиск ошибки в fread
Мне просто нужно сделать так что бы считались числа с файла a.dat. Функция malloc почему-то не работает
yalim
0 / 0 / 1
Регистрация: 22.05.2014
Сообщений: 4
30.05.2014, 21:20     Поиск ошибки в fread #6
замени NN на NumOfBytesToRead
перед malloc добавь (char*)
Anwer
 Аватар для Anwer
0 / 0 / 0
Регистрация: 02.01.2014
Сообщений: 49
30.05.2014, 21:34  [ТС]     Поиск ошибки в fread #7
Поиск ошибки в fread Все равно не вышло. Все правильно сделал, проверил бинарный файл, все чисто. Есть ли ещё способы считать данные с файла??
yalim
0 / 0 / 1
Регистрация: 22.05.2014
Сообщений: 4
30.05.2014, 21:38     Поиск ошибки в fread #8
Сообщение было отмечено автором темы, экспертом или модератором как ответ
есть, например с помощью класса std::ifstream

Добавлено через 1 минуту
насчет ошибки
либо не разыменовал указатель, либо с файлом что-то не так...
Anwer
 Аватар для Anwer
0 / 0 / 0
Регистрация: 02.01.2014
Сообщений: 49
30.05.2014, 23:00  [ТС]     Поиск ошибки в fread #9
Может ещё кто подскажет. Данные из файла a.dat, в файл c.dat записывает отлично. Но почему-то вылазит ошибка, что стек для переменной dL переполнен. Stack around the variable 'dL' was corupted. Всеравно так же по сути ошибка что и была. Может кто не будь написать нормальный код? Я уже не знаю в чем ошибки... Нужно что бы данные из файла a.dat были записаны в переменную dL, а из переменной dL записать данные в пустой файл c.dat.
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
#include <iostream>
using namespace std;
 
int main ()
{
    setlocale(LC_ALL, "RUS");
    FILE *f1, *f2, *f3;
    f1 = fopen("a.dat", "rb"); // открываю файл a.dat
    if ((f1 = fopen("a.dat", "rb")) == NULL) // ошибка открытия
    {    
        cout << "Невозможно открыть файл." << endl;
    }
    else
        cout << "Файл 'a.dat' успешно открыт и готов к чтению!" << endl;
    f2 = fopen("b.dat", "rb"); // открываю файл b.dat
    if ((f2 = fopen("b.dat", "rb")) == NULL) // ошибка открытия
    {    
        cout << "Невозможно открыть файл." << endl;
    }
    else
        cout << "Файл 'b.dat' успешно открыт и готов к чтению!" << endl;
    f3 = fopen("c.dat", "wb"); // открываю файл c.dat
    int dL;
    fread(&dL, sizeof(int), 2, f1);
    fwrite(&dL, sizeof(int), 2, f3);
    int fclose (char *f1);
    int fclose (char *f2);
    int fclose (char *f3);
    return 0;
}
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
31.05.2014, 01:18     Поиск ошибки в fread #10
Цитата Сообщение от Anwer Посмотреть сообщение
стек для переменной dL переполнен
Цитата Сообщение от Anwer Посмотреть сообщение
Stack around the variable 'dL' was corupted
Поищи в словаре слово corrupted что ли...
Цитата Сообщение от Anwer Посмотреть сообщение
f2 = fopen("b.dat", "rb"); // открываю файл b.dat
* * if ((f2 = fopen("b.dat", "rb")) == NULL) // ошибка открытия
зачем 2 раза делаешь fopen?
fread(&dL, sizeof(int), 2, f1);
почему два-то блин! у тебя одна переменная типа int! Естественно второй нет!
Anwer
 Аватар для Anwer
0 / 0 / 0
Регистрация: 02.01.2014
Сообщений: 49
04.06.2014, 00:54  [ТС]     Поиск ошибки в fread #11
Проблема с функцией fread, до сег пор осталась. Получается запись данных из одного файла a.dat, в другой файл c.dat, но после записи данных из одного файла в другой файл выдает ошибку Stack around the variable 'a' was corupted. Т.е. в файле a.dat числа (629520), скомпилировал программу, в файле c.dat оказались эти же числа (629520), но при этом выдало ошибку Stack around the variable 'a' was corupted. . Как с этим быть, и как эту проблему решить, помогите пожалуйста
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
#include <iostream>
#include <fstream>
#include <iostream>
#include <fstream>
using namespace std;
 
int main ()
{
    setlocale(LC_ALL, "RUS");
    FILE *f1, *f2, *f3;
    long int a, count;
    f1 = fopen("a.dat", "rb+"); // открываю файл a.dat
    if ((f1 = fopen("a.dat", "rb")) == NULL) // ошибка открытия
    {    
        cout << "Невозможно открыть файл." << endl;
    }
    else
        cout << "Файл 'a.dat' успешно открыт и готов к чтению!" << endl;
    f3 = fopen("c.dat", "wb+"); // открываю файл c.dat
    if ((f2 = fopen("b.dat", "rb")) == NULL) // ошибка открытия
    {    
        cout << "Невозможно открыть файл." << endl;
    }
    else
    {
        cout << "Файл 'c.dat' успешно открыт и готов к записи!" << endl;
    }
    for (int i = 0; i < 100; i++)
    {
    fseek(f1, 0L, SEEK_END);   
    count = ftell(f1);  
    fseek(f1, 0L, SEEK_SET);
    fread(&a, count, 1, f1);
    fseek(f1, 0L, SEEK_SET);
    fwrite(&a, count, 1, f3);
    }
    fclose (f1);
    fclose (f2);
    fclose (f3);
    return 0;
}
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
04.06.2014, 01:25     Поиск ошибки в fread #12
да что там думать-то? тож мне проблема!
a - должен быть массивом, а не одиночной переменной! Я тебе это уже не первый раз говорю! Ты вообще мои комменты читаешь?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.06.2014, 01:28     Поиск ошибки в fread
Еще ссылки по теме:

C++ Поиск ошибки.
C++ Поиск ошибки
C++ Поиск ошибки

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

Или воспользуйтесь поиском по форуму:
Anwer
 Аватар для Anwer
0 / 0 / 0
Регистрация: 02.01.2014
Сообщений: 49
04.06.2014, 01:28  [ТС]     Поиск ошибки в fread #13
Все получилось Спасибо
Yandex
Объявления
04.06.2014, 01:28     Поиск ошибки в fread
Ответ Создать тему
Опции темы

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