Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Ввод из файла


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

Автор: Nastya 13.4.2003, 17:13
Возможно вообще много вариантов, все зависит от того для чего ты этот файл в дальнейшем будешь использовать, что сейчас и в какой среде пишешь. Даю пример на вскидку, проверь на ошибки.
#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;

}



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




Автор: Nastya 13.4.2003, 17:19
Ой.
f.close() - надо со скобочками это ведь функция. Извеняюсь за ошибку

Автор: Artiom 13.4.2003, 20:09
Nastya
Извини если вопрос глупый но что такое
Цитата

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


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

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


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

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

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

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


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


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

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


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


Автор: DENNN 17.4.2003, 11:33
Почему бы скажем просто не сделать структуру
struct st
{
double value;
UINT index1;
UINT index2;
}
и читать прямо в нее? Тогда нет необходимости перегружать операторы, да и считать можно весь файл сразу в массив (например) .

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

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

    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 , я их просто покромсал чтобы на экране помещались

Автор: Gannibal 17.4.2003, 19:57
так считаваи по строке а в строке они у тебя пробелами отделены... проблемы невижу...

Автор: Fantasist 17.4.2003, 21: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;
     }
 }

}


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

Автор: Artiom 27.4.2003, 14:23
Чего-то у меня ничего не работает .
Если переопределять оператор с такими параметрами
Цитата
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'

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

Автор: comcon1 13.6.2005, 13:16
Ты писал:

Код

  operator>>(istream& is, TvoyClass matrix)


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

Код

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


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)