Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
1 / 0 / 1
Регистрация: 22.12.2008
Сообщений: 19

Из файла читается криво, помогите!

13.02.2009, 20:11. Показов 1736. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Сделал программу телефонной книжки с помощью MFC App Wizard.Записываю всю информацию в двоичный файл в порядке: номер контакта(4 байта (int)) Имя контакта(40байт строка) 5 номеров телефона(строки по 20 байт). Запись и считывание производиться с помощью класса fstream. Записывается все правильно - смотрел в блокноте этот файл, а на считывании информации обратно нормально считываются только 25 записей , а все остальные просто как пустые строчки! Помогите пожалуйста! Я УЖЕ ЦЕЛЫЙ МЕСЯЦ В ОТЛАДЧИКЕ ВСЕ ИСХОДИЛ ВЗАД И ВПЕРЕД. Хотя бы намекните в чем проблема может быть.
Функция читающая файл:

// размер структурного объекта 144 байт. Не работает когда их 26 записано в файл, т.е. размер файла 3744
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
struct contact
{
    int n ;
    char name[40] ;
    char number[5][20] ;
};
 
bool Phb::Open()  //
       {
        ifstream pb ;
    pb.open(PhBName) ;
    if(!pb) 
    {
        MessageBox((HWND)AfxGetMainWnd(), "Îøèáêà!!!", "PhoneBook", MB_OK) ;
        return false ;
    }
 
    else 
    { 
        pb.seekg(0, ios::end) ;
        N=pb.tellg() ;
        N/=sizeof(contact) ;  // количество записей(определяет правильно - проверял)
        if(N==0) return false ;
        cont = new contact[N] ;  // память нормально выделялася
        pb.seekg(0, ios::beg) ;
            for(int i=0; i<N; i++)
        {       
                         pb.read((char*)&cont[i].n, sizeof(int)) ;
                         pb.read(cont[i].name, 40) ;
                                 for(int j = 0; j<5; j++)
                 pb.read(cont[i].number[j], 20) ;
                         if(pb.eof()) break ;
        }
    pb.close() ;
    }
    return true;
    
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.02.2009, 20:11
Ответы с готовыми решениями:

Криво читается бинарник
Здравия желаю! #include &lt;iostream&gt; #include &lt;fstream&gt; using namespace std; void main() { char l=6,c=3,b; fstream...

Не читается из файла
Доброго времени суток, форумчане. В общем, столкнулся с проблемой, что не выводит на экран содержимое файла. Файл открывается, но...

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

3
 Аватар для Шерсть-На-Носу
48 / 48 / 8
Регистрация: 30.01.2009
Сообщений: 168
13.02.2009, 22:04
Навскидку:

По-умолчанию файлы через ifstream открываются как текстовые, а ты их читаешь как бинарные.

Похоже, ты пользуешься глобальными переменными. Это ОЧЕНЬ ПЛОХО.

Добавлено через 2 минуты 29 секунд
Да, и проверка на открытие файла делается так:

Code
1
if(!pb.is_open()) ...
Добавлено через 7 минут 5 секунд
Еще - была у меня когда-то проблема при определении размера файла таким способом:

Code
1
2
pb.seekg(0, ios::end) ;
N=pb.tellg() ;
Убедись, что

Code
1
pb.seekg(0, ios::beg) ;
ДЕЙСТВИТЕЛЬНО ставит курсор чтения в начало файла. Помнится, я тогда разбираться не стал, а просто закрыл файл и снова его открыл.

Добавлено через 1 час 7 минут 54 секунды
И вообще, записывать и читать лучше целыми блоками:

Code
1
2
3
4
5
for(int i=0; i<N; i++)
{       
    pb.read((char*)&(cont[i]), sizeof(struct contact)) ;
    if(pb.eof()) break ;
}
А то и вообще:

Code
1
pb.read((char*)cont, N*sizeof(struct contact)) ;
Запись производится аналогично.
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
13.02.2009, 22:09
Цитата Сообщение от Feda Посмотреть сообщение
Сделал программу телефонной книжки с помощью MFC App Wizard. .... (дальше поскипано)
Благородный дон - мазохист? Или его религиозные убеждения не позволяют использовать для чтения/записи файлов стандартный MFC-класс CStdioFile ?
С моей точки зрения, в приложении получается странная помесь чистого stream-oriented C++ и библиотеки MFC..... (все это сугубо имхо, конечно).
0
1 / 0 / 1
Регистрация: 22.12.2008
Сообщений: 19
14.02.2009, 17:59  [ТС]
Точно! Просто забыл на чтении ios::binary поставить. А при записи то все нормально делал. Тупо уйму времени убил(((((((((

Добавлено через 4 минуты 38 секунд
Цитата Сообщение от CheshireCat Посмотреть сообщение
Благородный дон - мазохист? Или его религиозные убеждения не позволяют использовать для чтения/записи файлов стандартный MFC-класс CStdioFile ?
С моей точки зрения, в приложении получается странная помесь чистого stream-oriented C++ и библиотеки MFC..... (все это сугубо имхо, конечно).
К твоему сведению он двоичный файл не пишет. Это делает CFile. А работать с CFile и fstream почти одинаково.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.02.2009, 17:59
Помогаю со студенческими работами здесь

Криво считывает из файла
Ситуация такая. Есть файл base.txt, там есть номера телефонов (по 11 символов каждый), пример ниже 79372937738 79277394843 ...

Неправильно читается имя файла
#include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;string.h&gt; using namespace std; int main() { char znaki = {&quot;:,-!.?;\&quot;&quot;},...

Криво читает кириллицу из файла
Судя по NodePad++ кодировка windows-1251. Но когда я пытаюсь преобразовать в коде в UTF8 ничего не получается(выдаёт то &quot;?&quot;, то...

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

Читается только одна строка из файла
Здравствыйте. помогите разобраться, почему у меня из файла читается только одна строка? Задача: Дан текстовый файл, в который записаны...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru