Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.53/64: Рейтинг темы: голосов - 64, средняя оценка - 4.53
141 / 84 / 24
Регистрация: 21.10.2009
Сообщений: 429

fstream не читает строки из файла!

23.10.2009, 22:39. Показов 12501. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня Visual Studio 2008 использую язык С++

У меня есть определенный класс который мне нужно записать. (Класс кстати TStudent - листинг класса в конце)
Вот код записи в файл:
C++
1
2
3
4
5
6
7
8
9
bool TStudent::_savegridtofile(TStudent student)
{
    ofstream file;
    file.open("student.arc", ios::binary | ios::ate);
    file.seekp(0);
    file.write((char *) &student, sizeof(TStudent));
    file.close();
    return true;
}
И жизнь вроде кажется шоколадом потому что в файл что-то пишется.
И жить бы мне да радоваться - НО!
Тут возникает потребность считать из файла, читаю я значит читаю класс, а он мне фигу
Вот код чтения из файла:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
TStudent TStudent::_loadfiletogrid(int rec_num)
{
    TStudent student;
    
    fstream file("student.arc", ios::in | ios::out | ios::binary);
    if (file == NULL) {return student;}
    file.seekp(0);
    file.getline((char *)&student, sizeof(TStudent));
    //file.read((char *) &student, sizeof(TStudent));
    file.close();
 
    return student;
}
Объясните пожалуйста чего за беда такая и как с ней справиться?
Листинг класса:
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
#pragma once
#include "string"
using namespace std;
 
 
class TPeople {
public:
    int num;
    string name;
    string fam;
    string otch;
    string date_b;
    string sex;
    string family;
 
//  TPeople();      //  конструктор
//  ~TPeople();     //  деструктор
};
 
class TStudent: public TPeople {
public:
    //TStudent(); //~TStudent();
 
    int course;
    string date_in;
    string student_num;
 
    bool _savegridtofile(TStudent student);
    TStudent _loadfiletogrid(int i);
};
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.10.2009, 22:39
Ответы с готовыми решениями:

Консоль не читает строки из текстового файла
Добрый день! Консолька принимает на вход вопрос и ищет из текстового файла ответ, путем перебора ПРоблема в том, что при запуске -...

Написать программу, которая читает первые три символа из каждой строки текстового файла
Написать программу, которая читает первые три символа из каждой строки текстового файла stroki.txt

Написать программу, которая читает строки из файла в массив строк, и выводит их на экран только названия, состоящие из нескольких слов
помогит плиз срочно надо а я вообще не знаю как их решать заранее спасибо 1)В файле хранятся названия фирм. Каждая строка запись об...

23
2838 / 1647 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
23.10.2009, 23:25
string содержит указатель на область памяти, в которой находится эта строка. Всё, что оказывается в файле, - это тот адрес (и прочее, но только не сама строка).
P.S. People - люди, народ. Великий студент наследует достояние целой нации!
1
141 / 84 / 24
Регистрация: 21.10.2009
Сообщений: 429
23.10.2009, 23:34  [ТС]
Цитата Сообщение от Somebody Посмотреть сообщение
string содержит указатель на область памяти, в которой находится эта строка. Всё, что оказывается в файле, - это тот адрес (и прочее, но только не сама строка).
P.S. People - люди, народ. Великий студент наследует достояние целой нации!
Рискну не согласиться, потому что при том когда я открываю файл там можно разглядеть часть некоторых слов которые я писал, например я записал свое имя в поле "Михаил" и сохранил в файл
так вот в файле мое имя выглядет " [кракозябры] ихаил [дальше кракозябры]" и так несколько слов можно проглядеть.

Добавлено через 3 минуты
Народ состоит из людей в том числе и студенты и пенсионеры и продавцы и все остальные
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
23.10.2009, 23:37
подсказали насчет строки правильно, а то что там будет находится - да что угодно, если хочешь таким образом что то корректно записывать в файл - не используй всяческих контейнеров, т.к. не известно где они в реальности свои данные хранят, плюс к этому ты читаешь из файла строку, а символ конца строки может встретится намного раньше, нежели длинна в байтах объекта.
1
141 / 84 / 24
Регистрация: 21.10.2009
Сообщений: 429
24.10.2009, 00:13  [ТС]
листинг файла в который произвожу запись
¤ю* ван
№М< ванов АhT эJm шКh ванов u•џIюяяя zшLw 1.01.1989 муж ?еK јиK Холост `eY 1.09.2008 ` хћЇ. 2IT6 Y ШеK
Вот видишь легко можно проследить некоторые надписи которые я вводил.

Добавлено через 1 минуту
Функция getline читает в бинарном файле указанное количество символов либо читает строку в простом файле.
Ну это на сколько я вычитал.

Добавлено через 8 минут
и кстати чем я пользуюсь getline или read не важно результат один и тот же...ну если думаете это из-за стрингов...ну посмотрю тогда в эту сторону сейчас...спасибо

Добавлено через 25 минут
если хочешь таким образом что то корректно записывать в файл - не используй всяческих контейнеров
А каким образом можно записывать корректно используя контейнеры?
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
24.10.2009, 00:35
а вообще подход немного не правильный... надо сохранять не весь класс, а чисто нужные данные, для этого можно внутри класса организовать структуру, которая будет хранить эти данные, а класс над этой структурой будет как интерфейс, в структуре данные хранить во встроенных типах (char,int...) и ее сохранять в файл

Добавлено через 2 минуты
Цитата Сообщение от mibin Посмотреть сообщение
А каким образом можно записывать корректно используя контейнеры?
см. в сторону серелизации в библиотеке boost, но ИМХО это гемор, и выльется в приличный кусок кода и потащит за собой половину boost-а
1
141 / 84 / 24
Регистрация: 21.10.2009
Сообщений: 429
24.10.2009, 00:58  [ТС]
Со структурой это мысль сейчас сделаю backup и посмотрю...
Первоначально я использовал char но мне пришлось от них отказаться в силу большого количества проблем при переводе из System::string в char .... ну то есть в char * num Такого вида легко перевести а вот в char num[10] уже никак...

Добавлено через 1 минуту
ну про boost я может на досуге после всего этого гемороя посмотрю для общего развития

Добавлено через 17 минут
Вот со структурой все это конечно очень красиво получилось...но не читается...ну не ужели реально из-за того что я string использую...
0
141 / 84 / 24
Регистрация: 21.10.2009
Сообщений: 429
24.10.2009, 10:27  [ТС]
И так...даже после того как я заменил string на char * все равно так ничего и не прочиталось...проблема как мне кажется в другом...может нужен особенный способ открытия файла может еще что-то...у меня уже кончились идеи

Добавлено через 45 секунд
Сохранять сохраняется читать не читается
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
24.10.2009, 11:12
с указателями тоже не получится, т.к. размер указателя == 4 байта, а размер данных на которые он указывает чаще всего больше,и сами данные располагаются вне структуры/класса, поэтому в файл адрес этого указателя, который при восстановлении (чтении) будет указывать неизвестно куда.
0
141 / 84 / 24
Регистрация: 21.10.2009
Сообщений: 429
24.10.2009, 11:36  [ТС]
Вот кстати так и получается ну блин...реально чего делать-то?

Добавлено через 5 минут
String не получится char * не получится а как тогда...есть ли способ что бы получилось? Есть ли способ перевода System::string в обыкновенный char и обратно или как? Чего делать-то?
0
 Аватар для breate
56 / 56 / 6
Регистрация: 23.10.2009
Сообщений: 250
24.10.2009, 11:38
а где ты учишься?
0
141 / 84 / 24
Регистрация: 21.10.2009
Сообщений: 429
24.10.2009, 11:48  [ТС]
эээ...в универе вообще-то...на заочке а что? МГУПИ так называемый

Добавлено через 7 минут
Вот я бы все понял если бы из файлов доставалась какая-нибудь непонятная кракозябра сплошная...да...тогда там либо типы надо указывать иначе либо еще что-то...но ведь из файла ни бита не читается...типа с понтом дела read проходит, а данных вообще никаких в переменных не оказалось...вот блин что меня и настораживает...
0
 Аватар для breate
56 / 56 / 6
Регистрация: 23.10.2009
Сообщений: 250
24.10.2009, 11:48
Московский гос... ? я писал эту задачу когдато... исходноков нет нужна переписывать я просто подумал если ты в минске учиишся, я мог бы лично показать как делать


выдели функции чтения записи в отдельный файл перед ними напиши заголовки иостреам,.. фстреам и пространство имён стд
бывают такие загагулины
0
141 / 84 / 24
Регистрация: 21.10.2009
Сообщений: 429
24.10.2009, 11:53  [ТС]
Нет я в Москве учусь но можешь хотя бы принцип объяснить...почему не читается или куда хоть смотреть

Добавлено через 1 минуту
Я в прошлом году писал эту задачу но она была в консоле и написана на Borland C++ а теперь обязательно приперло в Visual С++ и с графикой все зло исходит у меня от System::string ну так объясни пожалуйста чего делать-то
0
 Аватар для breate
56 / 56 / 6
Регистрация: 23.10.2009
Сообщений: 250
24.10.2009, 11:58
я обычно свои классы пишу с 0 - ля (не пользуясь другими..)
посмотри чему равен sizeof (TStudent) там очень много динамических вещей..
и ещё мне совсем не нравится преобразование в (char *) целого объекта

попробуй вывести всё по очереди с чуством с толком с растоновкой
0
141 / 84 / 24
Регистрация: 21.10.2009
Сообщений: 429
24.10.2009, 12:00  [ТС]
вот смотри
листинг файла чтения / записи они находятся в файла stud.cpp
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
#include "stdafx.h"
#include "stud.h"
#include "string.h"
#include "fstream"
 
 
using namespace std;
using namespace System;
 
bool TStudent::_savegridtofile(TStudent student) {
    
    ofstream file;
 
    file.open("student.arc", ios::binary | ios::ate);
    file.seekp(0);
    file.write((char *) &student.Info, sizeof(TStudent::Info));
    file.write((char *) &student.StudentInfo, sizeof(TStudent::StudentInfo));
    file.close();
 
    return true;
}
 
TStudent TStudent::_loadfiletogrid(int rec_num) {
    
    TStudent student;
    
    fstream file("student.arc", fstream::in | fstream::out | fstream::binary);
    if (file == NULL) {return student;}
    file.seekg(0);
    //file.getline((char *)&student.Info, sizeof(TStudent::Info));
    file.read((char *)&student.Info, sizeof(TStudent::Info));
    file.read((char *)&student.StudentInfo, sizeof(TStudent::StudentInfo));
    file.close();
 
    return student;
}
а вот листинг заголовочного файла stud.h
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
#pragma once
#include "string"
 
using namespace std;
 
 
//------------ список структур для классов ------------------------
//-----------------------------------------------------------------
struct TInfo {                     // структура для классса TPeople
    string name;
    string fam;
    string otch;
    string date_b;
    string sex;
    string family;
    int num;
};
 
struct TStudentInfo {              // структура для класса TStudent
    int course;
    string date_in;
    string student_num;
};
 
struct TSubject {                  // структура для класса TStudent
    int student_num;
    string subject;
    int estimation;
    int course;
};
 
//-----------------------------------------------------------------
 
class TPeople {
public:
    TInfo Info;
};
 
 
 
class TStudent: public TPeople {
public:
    TStudentInfo StudentInfo;
 
    bool _savegridtofile(TStudent student);
    TStudent _loadfiletogrid(int i);
};

Вот так все сейчас выглядит у меня и что характерно все сохраняется но ничего не читается вообще ни одной кракозябры не оказывается в переменной
0
 Аватар для breate
56 / 56 / 6
Регистрация: 23.10.2009
Сообщений: 250
24.10.2009, 12:01
Цитата Сообщение от mibin Посмотреть сообщение
все зло исходит у меня от System::string
так избався от него если знаешь что проблема в нём перепиши задачу с char *
0
141 / 84 / 24
Регистрация: 21.10.2009
Сообщений: 429
24.10.2009, 12:04  [ТС]
Вот листинг файла в который я сохранил данные:
 ван µFm  }Fm ванов  } ванович эEm}  Lв* 1.01.1989 XЋ”  XЋ”муж D*Ѓ *¦И   в* Холост mЬЬDЪаг*     T¦: ћљu Lв*  xMm 7IT6 Fm>‚ Lв* 
как видишь можно легко различить отдельные фрагменты слов и даты даже...а вот почему они не считываются...

Добавлено через 52 секунды
char * мне не помогают сохраняются только ссылки...единственное если делать дополнительные переворот с char * в обычный char...я пока только этого не пробовал...

Добавлено через 1 минуту
Полностью избавиться от System::string я не могу потому что получаю данные из dataViewGrid а оттуда они только в таком виде и выходят...приходится переводить либо в char* Либо в обычный string...первый точно не вариант...
0
 Аватар для breate
56 / 56 / 6
Регистрация: 23.10.2009
Сообщений: 250
24.10.2009, 12:10
я кы вечеру напишу и посмотрю что получится ... что то с разгона не прёт
0
141 / 84 / 24
Регистрация: 21.10.2009
Сообщений: 429
24.10.2009, 12:12  [ТС]
Огромное спасибо буду очень благодарен а-то стена меня скоро не выдержит
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.10.2009, 12:12
Помогаю со студенческими работами здесь

Создание файла fstream
Добрый день! Как создать документ с расширением .txt и названием, который введет пользователь. Т.е. есть переменная, которую заполняет...

fstream, создание файла
Привет всем, не могу справиться с проблемой. fstream file(FILE,ios::in|ios::out|ios::binary); файл не создается, но если создать...

Fstream - чтение из файла
подскажите начинающему программисту как читать файл целиком.. например последовательность чисел

Чтение файла через fstream
прочитать из файла матрицу и записать в новый файл её минимальный элемент в первой строке задана размерность матрицы файл: 10 8 ...

Запись в середину файла - fstream
Как можно при помощи fstream (хотелось бы именно им, потому что он умеет и читать, и писать) записать что-либо в середину файла (или куда...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru