Dr.Yevhenius
|
|
« : 07-02-2010 18:48 » |
|
Для уточнения: ifstream чтоб читать файлы, а ofstream - чтоб писать у файлы, верно? А то у меня проблема: пишу ifstream fin(filename.cstr(), ios::binary); if(!fin) { ... } else { ... }
а он создает новый файл!
|
|
« Последнее редактирование: 07-02-2010 18:53 от Inkognito »
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #1 : 07-02-2010 19:06 » |
|
http://www.cplusplus.com/reference/iostream/ifstream/ifstream/ Добавь масло масленное ifstream fin(filename.cstr(), ios::binary | ifstream::in); Кстати, а что значит это if(!fin) ?
|
|
« Последнее редактирование: 07-02-2010 19:09 от Finch »
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Dr.Yevhenius
|
|
« Ответ #2 : 07-02-2010 19:12 » |
|
Пока не пишу #include <fstream.h>, перегруженый оператор >> работает нормально (после cin >> some_string; получаю то, что написал). Если же подгрузить fstream.h, то при cin >> some_string; вызываеться оператор char(), а не >>(), а some_string получается пустой! Всегда так было? Кстати, а что значит это if(!fin) ?
Проверка: открылся ли файл.
|
|
« Последнее редактирование: 07-02-2010 19:20 от Inkognito »
|
Записан
|
|
|
|
Dr.Yevhenius
|
|
« Ответ #3 : 07-02-2010 19:12 » |
|
Пока не пишу #include <fstream.h>, перегруженый оператор >> работает нормально (после cin >> some_string; получаю то, что написал). Если же подгрузить fstream.h, то при cin >> some_string; вызываеться оператор char(), а не >>(), а some_string получается пустой! Всегда так было?
Даже перефразирую: после подгрузки fstream.h ни один с friend-методов не работает (а это методы ввода/вывода данных моего класа с помощью << и >>). Всегда был такой результат? P.S. Извините за изменение постов. Не хотел их плодить.
|
|
« Последнее редактирование: 07-02-2010 19:28 от Inkognito »
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #4 : 07-02-2010 19:18 » |
|
И это у тебя работает? У тебя класс создается статически. Т.е. он всегда будет создан. Открылся файл или нет. И еше одно. If the constructor is not successful in opening the file, the object is still created although no file is associated to the stream buffer and the stream's failbit is set (which can be checked with inherited member fail)
Т.е. даже если не удалось открыть файл, объект все равно будет создан. Посмотри метод good() http://www.cplusplus.com/reference/iostream/ios/good/ Он как раз подскажет, что не было проблем.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #5 : 07-02-2010 19:21 » |
|
Пока не пишу #include <fstream.h>, перегруженый оператор >> работает нормально (после cin >> some_string; получаю то, что написал). Если же подгрузить fstream.h, то при cin >> some_string; вызываеться оператор char(), а не >>(), а some_string получается пустой! Всегда так было?
Точно не могу сказать. Но единственная большая разница. Что у cin дискриптор четко прописан stdin. Если у тебя происходят сбои. Значит кто то или прописывает другой дискриптор, или подменяет дискриптор stdin.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Dr.Yevhenius
|
|
« Ответ #6 : 07-02-2010 19:25 » |
|
И это у тебя работает? У тебя класс создается статически. Т.е. он всегда будет создан. Открылся файл или нет.
Да - переменная НЕ создана в дин. памяти, и да - до сих пор это работало. Собственно, из учебника такой алгоритм взял и теперь всегда использую.
|
|
|
Записан
|
|
|
|
Dr.Yevhenius
|
|
« Ответ #7 : 07-02-2010 19:27 » |
|
Книга Джесса Либерти "Освой самостоятельно С++ за 21 день" -> День 17. Потоки.
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #8 : 07-02-2010 19:28 » |
|
Упс, моя не внимательность. Оператор ! перегружен.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Dr.Yevhenius
|
|
« Ответ #9 : 07-02-2010 19:32 » |
|
class istring { friend std::ostream & operator<<(std::ostream &, istring &); friend std::istream & operator>>(std::istream &, istring &); };
// И ЭТИ ДВА МЕТОДА ПОСЛЕ FSTREAM.H НЕ РАБОТАЮТ :( std::ostream & operator<<(std::ostream & pout, istring & pstring) { } std::istream & operator>>(std::istream & pin, istring & pstring) { }
Или ты не об этих перегруженых операторах (а то я их случайно таковыми назвал ).
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #10 : 07-02-2010 19:34 » |
|
Сейчас я у себя попробую повторить твою проблему
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Dr.Yevhenius
|
|
« Ответ #11 : 07-02-2010 19:40 » |
|
#include <stdafx.h> #include <iostream> #include <fstream.h>
class istring { friend std::ostream & operator<<(std::ostream &, istring &); friend std::istream & operator>>(std::istream &, istring &); };
// И ЭТИ ДВА МЕТОДА ПОСЛЕ FSTREAM.H НЕ РАБОТАЮТ :( std::ostream & operator<<(std::ostream & pout, istring & pstring) { } std::istream & operator>>(std::istream & pin, istring & pstring) { }
/* // Эти три using не нужны после #include <fstream.h> using std::cout; using std::cin; using std::ifstream;*/
int main(int argc, char* argv[]) { istring str;
cout << str;
system("PAUSE"); return 0; }
--------------------Configuration: MAlgo - Win32 Debug-------------------- Compiling... Algo.cpp D:\Programs\Algo.cpp(29) : error C2678: binary '<<' : no operator defined which takes a left-hand operand of type 'class ostream_withassign' (or there is no acceptable conversion) Error executing cl.exe.
MAlgo.exe - 1 error(s), 0 warning(s)
|
|
|
Записан
|
|
|
|
Dr.Yevhenius
|
|
« Ответ #12 : 07-02-2010 19:46 » |
|
А вот если так (всё без приставки std:: ): #include <stdafx.h> #include <iostream> #include <fstream.h>
class istring { friend ostream & operator<<(ostream &, istring &); friend istream & operator>>(istream &, istring &); };
// И ЭТИ ДВА МЕТОДА ПОСЛЕ FSTREAM.H НЕ РАБОТАЮТ :( ostream & operator<<(ostream & pout, istring & pstring) { return pout; // Не обращайте внимания на отсутствие этого в посте ранее } istream & operator>>(istream & pin, istring & pstring) { return pin;// Не обращайте внимания на отсутствие этого в посте ранее }
/* // Эти три using не нужны после #include <fstream.h> using std::cout; using std::cin; using std::ifstream;*/
int main(int argc, char* argv[]) { istring str;
cout << str;
system("PAUSE"); return 0; }
то всё нормально. Но я не могу написать так. Класс-то istring находиться в файле istring.h, а там #include <fstream.h> нету, а без него упускать std:: не можно.
|
|
|
Записан
|
|
|
|
Dr.Yevhenius
|
|
« Ответ #13 : 07-02-2010 19:49 » |
|
Не вариант также написать в istring.h строки using std::cout; и using std::cin; иначе при его подгрузке пользователю нужно гадать: писать эти две строчки или нет, были они описаны до этого или нет?
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #14 : 07-02-2010 20:20 » |
|
По правилам С++ нужно использовать <fstream> заместо <fstream.h> Так как эти библиотеки относятся именно к C++. И естественно тебе нужно поднимать использование namespace. Кстати, я сейчас прогнал примерчик у себя. У меня ничего не перекрывается. Работает как часики. Единственное, что оператор >> не читает больше 36 байт с файла. Надо использовать метод read. #include <iostream> #include <fstream>
using std::ifstream; using std::cin; using std::cout; using std::endl;
int main() { char buffer[512]; for (int i=0; i<512; i++) buffer[i]=0; ifstream fin("mbr.img", ifstream::binary | ifstream::in); if (!fin) { cout << "I can't open file" << endl; } else { fin.width(512); //fin >> buffer; fin.read(buffer, 512); cout << "Position " << fin.tellg() << endl; int a; cin >> a; cout << endl << a << endl; for (int i=0; i<512; i++) cout <<(unsigned int) buffer[i] << " "; cout << endl; fin.close(); } return 0; }
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Dr.Yevhenius
|
|
« Ответ #15 : 07-02-2010 20:31 » |
|
#include <fstream> - это действительно помогло. Всё заработало. Finch, спасибо за помощь и за потраченое время!
|
|
« Последнее редактирование: 07-02-2010 20:41 от Inkognito »
|
Записан
|
|
|
|
|