Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ввод из файла, ??????? 
:(
    Опции темы
Artiom
Дата 13.4.2003, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1031
Регистрация: 11.3.2003
Где: Минск\Баку

Репутация: нет
Всего: 17



Подскажите как лучше организовать ввод таких элементов из файла.
Объект -- это число и два индекса к нему. Какую структуру лучше иметь файлу? И как оттуда все прочитать?
Хорошо бы пример кода а то я этого воще не знаю.


--------------------
Если тебя жизнь трахает, значит, ты ещё живой
PM MAIL ICQ   Вверх
Nastya
Дата 13.4.2003, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 27.3.2002
Где: Мариуполь

Репутация: 5
Всего: 44



Возможно вообще много вариантов, все зависит от того для чего ты этот файл в дальнейшем будешь использовать, что сейчас и в какой среде пишешь. Даю пример на вскидку, проверь на ошибки.
#include <iostream.h>
#include <fstream.h>

class A{
private:
double value;
int i1;
int i2;
public:
// то да се, конструкторы там всякие, методы
friend istream& operator >>(istream& s, A& x);//Для ввода из файла
friend ostream& operator <<(ostream& s, A& x);//Для вывода в файл
};
istream& A::operator >>(istream& s, A& x)
{
s>>value;
s>>i1;
s>>i2;
return s;
}

ostream& A::operator >>(ostream& s, A& x)
{
s<<setw(20)<<value;
s<<setw(10)<<i1;
s<<setw(10)<<i2<<endl;
return s;
}


int main()
{
fstream f;
A obj;
//Теперь заносим объект в файл
f.open("имя и путь файла",ios::out);
if(!f) return 1;
f<<obj;
f. close;

//А вот из файла считываем
f.open("имя и путь файла",ios::шт);
if(!f) return 1;
f>>obj;
f. close;

}



А вообще существует много способови много нюансов. Ты бы уточнил.






--------------------
Что бы понять рекурсию, надо понять рекурсию

"Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор
PM MAIL   Вверх
Nastya
Дата 13.4.2003, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 27.3.2002
Где: Мариуполь

Репутация: 5
Всего: 44



Ой.
f.close() - надо со скобочками это ведь функция. Извеняюсь за ошибку


--------------------
Что бы понять рекурсию, надо понять рекурсию

"Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор
PM MAIL   Вверх
Artiom
Дата 13.4.2003, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1031
Регистрация: 11.3.2003
Где: Минск\Баку

Репутация: нет
Всего: 17



Nastya
Извини если вопрос глупый но что такое
Цитата

s<<setw(20)<<value;
s<<setw(10)<<i1;
s<<setw(10)<<i2<<endl;


конкретно setw(20). А вообще как раз что-то такое я и хотел и класс похожий на А у меня есть


--------------------
Если тебя жизнь трахает, значит, ты ещё живой
PM MAIL ICQ   Вверх
Nastya
Дата 14.4.2003, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 27.3.2002
Где: Мариуполь

Репутация: 5
Всего: 44



Я тут перегрузила оператор >> может не самый легкий пть, но им потом весьма удобно польщоваться.
setw(20) - задает ширину выводимого поля.
Например если мое value будет 12345, то в файл оно запишется так
12345
- 15 пробелов и 5 цифр - общая ширина 20.
Этого можно не делать, но я же не знаю, для чего тебе файл, а эта фишка будет удобнее, если потом в нем указаетль позиционировать.


Ты бы подробнее написал, для чего все это, может предложу что получше.
Кстати, я еще забыла подключить
#include <iomanip.h>
- в нем этот setw и много другого полезного. Пощи информацию по потокам ввода вывода и по манипуляторам потоков.
Хотя опять повторюсь можно это сделать и по другому.
Ты какое приложение пишешь консольное, win32, с MFC или еще какое.



--------------------
Что бы понять рекурсию, надо понять рекурсию

"Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор
PM MAIL   Вверх
Artiom
Дата 14.4.2003, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1031
Регистрация: 11.3.2003
Где: Минск\Баку

Репутация: нет
Всего: 17



Пишу я обычное консольное приложение. Нужно мне это вот для чего :
написан класс для хранения разреженной матрицы, я храню число--элемент матрицы и его индексы. Теперь мне надо организовать загрузку реальной матрицы из файла. Можно плюс к этому как-то пометить в файле размерность матрицы или нужно какой-то счетчик делать?


--------------------
Если тебя жизнь трахает, значит, ты ещё живой
PM MAIL ICQ   Вверх
Nastya
Дата 17.4.2003, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 27.3.2002
Где: Мариуполь

Репутация: 5
Всего: 44



В принципе, можно первым делом в файл записывать количество элементов. и первым же делом его считывать.
Можно считывать каждый элемент до тех пор пока не будет достигнут конец файла

fstream f;
f.open(......


while(f.peek()!=EOF)
{
считываем элемент
.....
}




--------------------
Что бы понять рекурсию, надо понять рекурсию

"Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор
PM MAIL   Вверх
Nastya
Дата 17.4.2003, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 27.3.2002
Где: Мариуполь

Репутация: 5
Всего: 44



В принципе, можно первым делом в файл записывать количество элементов. и первым же делом его считывать.
Можно считывать каждый элемент до тех пор пока не будет достигнут конец файла

fstream f;
f.open(......


while(f.peek()!=EOF)
{
считываем элемент
.....
}




--------------------
Что бы понять рекурсию, надо понять рекурсию

"Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор
PM MAIL   Вверх
DENNN
Дата 17.4.2003, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

Репутация: 1
Всего: 43



Почему бы скажем просто не сделать структуру
struct st
{
double value;
UINT index1;
UINT index2;
}
и читать прямо в нее? Тогда нет необходимости перегружать операторы, да и считать можно весь файл сразу в массив (например) .
PM ICQ   Вверх
Step
Дата 17.4.2003, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5151
Регистрация: 26.9.2002
Где: дурдом.UA

Репутация: 5
Всего: 25



Nastya
а почему бы не сделать твой класс произвольным от объекта, тогда стандартная сериализация будет работать


--------------------
- Дурак учится на своих ошибках, умный на чужих.
 - умные учатся у дураков
PM MAIL ICQ   Вверх
Artiom
Дата 17.4.2003, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1031
Регистрация: 11.3.2003
Где: Минск\Баку

Репутация: нет
Всего: 17



К сожалению получил счас конкретный текстовый файл , с которого надо прочитать данные. Выглядит это так:
Цитата

    N          U1            U2            UC            U4        U3            UR
<    0>  +0.0        +0.0e      +1.0                0.0    +0.0            +0.0
<    1>  +0.00      +0.0        +1.91e+003  -3.33  -6.0e-001    +9.12e-013
<    2>  +0.0        -3.3          +1.918e+003 -3.33 -6.0e-001    +9.12046e-013
<    3>  +0.0e      -3.3          +2.3e+003    -2.2  -7.5e-001      6.18


Как это нормально обработать? Элементы имеют тип Double , я их просто покромсал чтобы на экране помещались


--------------------
Если тебя жизнь трахает, значит, ты ещё живой
PM MAIL ICQ   Вверх
Gannibal
Дата 17.4.2003, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 742
Регистрация: 15.4.2003
Где: 010101

Репутация: нет
Всего: 17



так считаваи по строке а в строке они у тебя пробелами отделены... проблемы невижу...


--------------------
Я родился в этом безумном мире - и Я сделаю всё чтобы в нём выжить!
PM MAIL ICQ   Вверх
Fantasist
Дата 17.4.2003, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: 4
Всего: 41



Так вот, Nastya, самый правильный вариант предложила, на мой взгляд. Переопредели операторы<<,>> для потоков, потом создаешь файловый поток и читаешь. Примерно так:

Код


operator>>(istream& is, TvoyClass matrix)
{
 char cur=is.get();
 
 int curCol=0;
 int curLine=0;

 double number;

 while  (cur!=0)
 {
     switch (cur)
     {
         case '+':  is>>number; matrix[curCol,curLine]=number; break;
         case '-':  is>>number; matrix[curCol,curLine]=-number; break;
         case 13:  ++curLine; break;
         case ' ': while (cur==' ') cur=is.get(); ++curCol; break;
     }
 }

}


Только надо у тебя пропустить мусор в начале.


--------------------
Волны гасят ветер...
PM MAIL   Вверх
Artiom
Дата 27.4.2003, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1031
Регистрация: 11.3.2003
Где: Минск\Баку

Репутация: нет
Всего: 17



Чего-то у меня ничего не работает .
Если переопределять оператор с такими параметрами
Цитата
operator>>(istream& is, TvoyClass matrix)

то компилятор ругается
Цитата
binary operator has too many parametrs

а если просто
Цитата
operator>>(istream& is)

то на любое объявление переменной типа
Цитата

char cur=is.get();
 int curCol=0;
 int curLine=0;

ругается
Цитата

unknown character '0xa0'

Помогите!!!! Не понимаю.



--------------------
Если тебя жизнь трахает, значит, ты ещё живой
PM MAIL ICQ   Вверх
comcon1
Дата 13.6.2005, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: 12
Всего: 17



Ты писал:

Код

  operator>>(istream& is, TvoyClass matrix)


Попробуй так:

Код

  operator>>(istream& is, TvoyClass &matrix)




--------------------
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1220 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.