Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: fstream.h  (Прочитано 12453 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« : 07-02-2010 18:48 » 

Для уточнения: ifstream чтоб читать файлы, а ofstream - чтоб писать у файлы, верно?
А то у меня проблема: пишу
Код:
ifstream fin(filename.cstr(), ios::binary);
if(!fin)
{
                ...
}
            else
{
                ...
}
а он создает новый файл!
« Последнее редактирование: 07-02-2010 18:53 от Inkognito » Записан
Finch
Спокойный
Администратор

il
Offline 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
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #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
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #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
Спокойный
Администратор

il
Offline 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
Спокойный
Администратор

il
Offline 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
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #6 : 07-02-2010 19:25 » 

И это у тебя работает? У тебя класс создается статически. Т.е. он всегда будет создан. Открылся файл или нет.
Да - переменная НЕ создана в дин. памяти, и да - до сих пор это работало. Собственно, из учебника такой алгоритм взял и теперь всегда использую.
Записан
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #7 : 07-02-2010 19:27 » 

Книга Джесса Либерти "Освой самостоятельно С++ за 21 день" -> День 17. Потоки.
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #8 : 07-02-2010 19:28 » 

Упс, моя не внимательность. Оператор ! перегружен.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #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
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #10 : 07-02-2010 19:34 » 

Сейчас я у себя попробую повторить твою проблему Улыбаюсь
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #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
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #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
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #13 : 07-02-2010 19:49 » 

Не вариант также написать в istring.h строки using std::cout; и using std::cin; иначе при его подгрузке пользователю нужно гадать: писать эти две строчки или нет, были они описаны до этого или нет?
Записан
Finch
Спокойный
Администратор

il
Offline 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
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #15 : 07-02-2010 20:31 » 

#include <fstream> - это действительно помогло. Всё заработало. Finch, спасибо за помощь и за потраченое время!
« Последнее редактирование: 07-02-2010 20:41 от Inkognito » Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines