Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > 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 Извини если вопрос глупый но что такое
конкретно 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 | ||
К сожалению получил счас конкретный текстовый файл , с которого надо прочитать данные. Выглядит это так:
Как это нормально обработать? Элементы имеют тип Double , я их просто покромсал чтобы на экране помещались |
Автор: Gannibal 17.4.2003, 19:57 |
так считаваи по строке а в строке они у тебя пробелами отделены... проблемы невижу... |
Автор: Fantasist 17.4.2003, 21:41 | ||
Так вот, Nastya, самый правильный вариант предложила, на мой взгляд. Переопредели операторы<<,>> для потоков, потом создаешь файловый поток и читаешь. Примерно так:
Только надо у тебя пропустить мусор в начале. |
Автор: Artiom 27.4.2003, 14:23 | ||||||||||
Чего-то у меня ничего не работает . Если переопределять оператор с такими параметрами
то компилятор ругается
а если просто
то на любое объявление переменной типа
ругается
Помогите!!!! Не понимаю. |
Автор: comcon1 13.6.2005, 13:16 | ||||
Ты писал:
Попробуй так:
|