Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 02.01.2014
Сообщений: 49
1

Поиск ошибки в fread

30.05.2014, 19:25. Показов 1689. Ответов 12
Метки нет (Все метки)

У меня возникла ошибка. Мне нужно прочесть данные с бинарных файлов. Бинарный файл "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;
}
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.05.2014, 19:25
Ответы с готовыми решениями:

Ошибка 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;...

fread
Подскажите пожалуйста, как можно записать в структура данные из файла используя fread, просто все...

Работа с fread()
Нужно прочитать данные из файла и вывести на экран. Но когда я вывожу то ещё дописываются ненужные...

Fread и fout?
Здравствуйте. Была поставлена предо мной задача: Сделать структуру, которая через меню будет...

12
3413 / 2772 / 751
Регистрация: 25.03.2012
Сообщений: 10,081
Записей в блоге: 1
30.05.2014, 19:33 2
Лучший ответ Сообщение было отмечено Anwer как решение

Решение

Цитата Сообщение от Anwer Посмотреть сообщение
при попытки изменить fread(&d, sizeof(d), 1, f1);
при попытке изменить... что?
количество символов?
Ну правильно! в одну переменную типа char можно считать лишь один символ(байт)!
0
0 / 0 / 0
Регистрация: 02.01.2014
Сообщений: 49
30.05.2014, 20:34  [ТС] 3
Тогда как мне прочесть нормально "a.dat" ? Что бы '7 0 1 0 1 0 1 0 2 6 2' из файла "a.dat" были помещены в переменную d?
0
0 / 0 / 1
Регистрация: 22.05.2014
Сообщений: 4
30.05.2014, 20:52 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);
0
0 / 0 / 0
Регистрация: 02.01.2014
Сообщений: 49
30.05.2014, 21:07  [ТС] 5
Не получилось, скрин ошибок выложил.
Поиск ошибки в fread

Мне просто нужно сделать так что бы считались числа с файла a.dat. Функция malloc почему-то не работает
0
0 / 0 / 1
Регистрация: 22.05.2014
Сообщений: 4
30.05.2014, 21:20 6
замени NN на NumOfBytesToRead
перед malloc добавь (char*)
0
0 / 0 / 0
Регистрация: 02.01.2014
Сообщений: 49
30.05.2014, 21:34  [ТС] 7
Поиск ошибки в fread
Все равно не вышло. Все правильно сделал, проверил бинарный файл, все чисто. Есть ли ещё способы считать данные с файла??
0
0 / 0 / 1
Регистрация: 22.05.2014
Сообщений: 4
30.05.2014, 21:38 8
Лучший ответ Сообщение было отмечено Anwer как решение

Решение

есть, например с помощью класса std::ifstream

Добавлено через 1 минуту
насчет ошибки
либо не разыменовал указатель, либо с файлом что-то не так...
0
0 / 0 / 0
Регистрация: 02.01.2014
Сообщений: 49
30.05.2014, 23:00  [ТС] 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;
}
0
3413 / 2772 / 751
Регистрация: 25.03.2012
Сообщений: 10,081
Записей в блоге: 1
31.05.2014, 01:18 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! Естественно второй нет!
1
0 / 0 / 0
Регистрация: 02.01.2014
Сообщений: 49
04.06.2014, 00:54  [ТС] 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;
}
0
3413 / 2772 / 751
Регистрация: 25.03.2012
Сообщений: 10,081
Записей в блоге: 1
04.06.2014, 01:25 12
да что там думать-то? тож мне проблема!
a - должен быть массивом, а не одиночной переменной! Я тебе это уже не первый раз говорю! Ты вообще мои комменты читаешь?
1
0 / 0 / 0
Регистрация: 02.01.2014
Сообщений: 49
04.06.2014, 01:28  [ТС] 13
Все получилось Спасибо
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.06.2014, 01:28

Не работает fread()
Почему выводится -858993615, если в файле &quot;f.txt&quot; содержится простая &quot;1&quot;? Вот листинг программы:...

Непонятки с fread
Добрый день. Столкнулся с такой проблемой: читаю обычный текстовый файл, однако помимо его...

Не работает fread()
Почему такой странный вывод?

Вывод с Fread
Не выводит с помощью Fread, сейчас его нету, использвал fgets, но мне именно нужно fread, помогите...


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

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

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