Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915

Приведение переменной типа istream к bool

16.12.2018, 12:44. Показов 2013. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте,

Подскажите пожалуйста:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
int main()
{
    string way = "C:\\11\\Text3.txt";
    ifstream F;
    F.open(way);
 
    char Simvol;
 
    if (F) 
    {
        cout << "File found" << "\n";
    }
    else
    {
        cout << "File not found" << "\n";
    }
 
    while (F.get(Simvol))
    {
        cout << Simvol;
    }
    F.close();
 
}
Подскажите пожалуйста, как можно какой либо переменной присоваить занчение выдаваемое "F" при положительном или отрицательном открытии файла, то есть, это наверное или NULL/TRUE/FALSE.

Думал что можно так:
C++
1
bool Symv = F
Но визуал студия ругается на то, что "не существует подходящей функции преобразования из STD::fstream в "bool".

В какой виде тогда тогда хранится эта информация и как ее присвоить переменной ?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.12.2018, 12:44
Ответы с готовыми решениями:

Работа с глобальной переменной типа bool
ок, я создала глобальную переменную типа bool (да, лучше этого избегать и все такое, но сейчас так надо) пусть будет bool abc; в main...

Не сохранение значения переменной типа bool
Добрый день, По учебе, решаю задачу. Не очень понимаю, как ее решить, но стараемся. Есть проблема с переменной значения bool (us). На...

Присвоение переменной типа std::string значение bool
Объясните, почему компилируется такой код: std::string str; str = true; а такой нет:

21
Модератор
Эксперт С++
 Аватар для zss
13769 / 10962 / 6491
Регистрация: 18.12.2011
Сообщений: 29,236
16.12.2018, 12:52
C++
1
bool Symv = static_cast<bool>(F);
0
 Аватар для Babysitter
245 / 139 / 53
Регистрация: 23.11.2015
Сообщений: 394
16.12.2018, 13:09
вариант с експлисит кастом мне не нравится. по идее можно использовать интерфейс самого потока, а именно функции good,
eof, fail, bad. каст в bool это то же самое что вызов !fail(), но в вашем случае может хватить вызова good().
0
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
16.12.2018, 13:49  [ТС]
Спасибо!!

Все три варианта работают:
C++
1
2
3
bool Symv1 = F.good();                      // "1" в случае, если ifstream успешный, и "0" если не успешный
bool Symv2 = F.fail();                         //  "1" в случае, если ifstream не успешный, и "0" если успешный
bool Symv3 = static_cast<bool>(F);    //   аналогично good()
0
Параллельный Кот
 Аватар для valen10
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
16.12.2018, 14:26
Babysitter, каст в bool проверяет еще и badbit.

Добавлено через 11 минут
Прошу прощения за невнимательность, Вы правы, fail() тоже его проверяет.
0
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
24.12.2018, 22:52  [ТС]
Еще раз Здравствуйте!

Подскажите, почему, если считывать посимвольно из файла, это символ можно поместить в переменную char, int, но нельзя в string ?

C++
1
2
3
4
5
6
7
8
string way = "C:\\11\\Text3.txt";
ifstream F;
F.open(way);
 
char Symvol_char = F.get();
int Symvol_int = F.get();
 
string Symvol_string = F.get();  // выдает ошибку
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
25.12.2018, 00:08
C++
1
2
string Symvol_string(1, '\0');
Symvol_string[0] = F.get();
Строка есть массив символов.

Добавлено через 2 минуты
А если нужно наполнять её, то есть поток заполнения строк ostringstream

Добавлено через 51 минуту
* массив символов конкретно в случае std::string динамический, управляется собственно статическим объектом std::string, выполняющим функции обёртки
0
 Аватар для alkl
119 / 94 / 35
Регистрация: 18.12.2012
Сообщений: 654
25.12.2018, 01:07
Цитата Сообщение от Optimus11 Посмотреть сообщение
это символ можно поместить в переменную char, int, но нельзя в string ?
Можно, но не при инициализации.
Вот так должно прокатить :
C++
1
2
string Symvol_string;
Symvol_string = F.get();
При условии, что F.get() возвращает char (лень проверять).

Добавлено через 2 минуты
Со string'ом даже + прокатывает.
C++
1
Symvol_string = Symvol_string + F.get();
Добавлено через 1 минуту
PS: Почему конструктор преобразования не добавили (хотябы с перегруженным char'ом) - остаётся тайной...
0
Параллельный Кот
 Аватар для valen10
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
25.12.2018, 01:29
Цитата Сообщение от alkl Посмотреть сообщение
конструктор преобразования не добавили (хотябы с перегруженным char'ом)
Что за конструктор еще такой?

Добавлено через 4 минуты
Если речь о неявном преобразовании, то можно еще так.

C++
1
string s = {1, static_cast<char>(cin.get())};
0
 Аватар для alkl
119 / 94 / 35
Регистрация: 18.12.2012
Сообщений: 654
25.12.2018, 01:55
Цитата Сообщение от valen10 Посмотреть сообщение
Что за конструктор еще такой?
Даже вот и не знаю, что ответить на этот вопрос
Скажем так. Это конструктор, имеющий в аргументах произвольные типы.
C++
1
2
3
4
5
6
7
8
9
10
11
12
class A{
public:
    A(int _i):i(_i){        // Вот он
        
    }
 
    int i;
};
 
 
A   a=10;       // Вызовется конструктор преобразования.
A   b(100);     // Тоже самое
Вот его, к сожалению, с перегруженным аргументом для char, в классе string, нет. Иначе не объяснить непроглатывание символа при инициализации.

Добавлено через 4 минуты
Или я ошибаюсь, и он (конструктор) не так обзывается ?
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
25.12.2018, 13:27
alkl, у std::string нет конструктора, который принимал бы только один начальный символ.

Есть всего 11 конструкторов https://en.cppreference.com/w/... sic_string, из которых ближайший который тебе подойдёт - в котором задаётся число исходное символов строки и собственно символ, которым будет заполняться эта строка во время создания (номер 2 в том списке или номер 6 в этом списке - http://www.cplusplus.com/refer... ng/string/).
1
 Аватар для alkl
119 / 94 / 35
Регистрация: 18.12.2012
Сообщений: 654
25.12.2018, 15:07
TRam_, да, это я уже понял. О чём, собственно, и пытался сказать.
0
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
26.12.2018, 18:54  [ТС]
1)Можно сделать вот так, на это компилятор не ругается:

C++
1
string Symvol_string = "" + F.Get()
И если это вывести на консоль, то там не считанный символ, а какая то абра-кадабра.

а если сделать вот так:
C++
1
string Symvol_string = "q23" + F.Get()
То выводится "Vector subscript out of range"

2)Тоже самое и с:
C++
1
int Symvol_int = F.Get()
Вроде бы все работает, но если вывести на консоль, то выводится совершенно другой символ.

Или сразу в int считать нельзя, только через преобразование из Char в int ?
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
26.12.2018, 23:23
C++
1
std::string Symvol_string = std::string("q23") + F.get();
0
 Аватар для Babysitter
245 / 139 / 53
Регистрация: 23.11.2015
Сообщений: 394
26.12.2018, 23:30
Цитата Сообщение от Optimus11 Посмотреть сообщение
Подскажите, почему, если считывать посимвольно из файла, это символ можно поместить в переменную char, int, но нельзя в string ?
C++
1
std::string Symvol_string(1, F.get());
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
26.12.2018, 23:30
Цитата Сообщение от Optimus11 Посмотреть сообщение
Вроде бы все работает, но если вывести на консоль, то выводится совершенно другой символ.
Не путай цифру арабского числа, которой соответствует символ, и код символа, который этому числу соответствует. Это очень разные вещи.

C++
1
2
3
int a_code = '6'; // в a_code записывается код символа 6
int a_value = a_code - '0'; // в кодировке ASCII и совместимых с ней коды арабских цифр идут по порядку, 
// поэтому для получения значения цифры можно вычесть код символа '0'
0
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
28.12.2018, 19:55  [ТС]
Прошу извинить, позвольте еще задать вопрос:

Считанный символ char с помощью Get, можно записать в String таким образом:
C++
1
2
3
4
char Symvol_char = F.Get();
 
string Symvol_string = "";
Symvol_string = Symvol_string+Symvol_char;
Тут один вопрос:
1)В переменную типа String нельзя добавить какое то значение, если в этой переменной ничего нет, поэтому прежде, формально можно добавить "", то есть - string Symvol_string = "";
После чего уже можно уже обьеденять значения чаров и стрингов.

Но, я не могу понять, ведь эта запись Symvol_string = "", ничего не добавлять в переменную, если даже с помощью length определить длину стринга, то он покажет, что длинна нулевая. То есть, что добавляй "значение" - "", что не добавляй, длинна нулевая, но в одной случае, обьеденять с помощью "+" не получится, в другом уже все работает.
0
 Аватар для Mesteriis
599 / 237 / 69
Регистрация: 08.08.2015
Сообщений: 1,637
28.12.2018, 23:59
Цитата Сообщение от Optimus11 Посмотреть сообщение
в другом уже все работает.
Исключительно зависит от настроек среды, у меня и так все три записи
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
system ("clear");
    string test;
    test = test + "test";
    cout << test;
 
    string test;
    test  += "test";
    cout << test;
 
    string test = NULL;
    test  += "test";
    cout << test;
работает

Цитата Сообщение от Optimus11 Посмотреть сообщение
C++ (Qt)
1
char Symvol_char = F.Get();
Это прям по условию, или getline() не знаешь?
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
29.12.2018, 08:42

Не по теме:

Цитата Сообщение от Mesteriis Посмотреть сообщение
Исключительно зависит от настроек среды
Да не зависит. Среда тут не при чем. Тут человечечкий фактор.



Добавлено через 10 минут
Автор наверное спрашивает чем отличается запись
C++
1
string s = "" + ch;
от записи
C++
1
2
string s = "";
s = s + ch;
Ответ простой. Отличается типом.
В первом выражении "" - это строковый литерал, тип которого (в данном случае) - const char[1], т.е. массив из одного char.
Когда мы прибавляем к нему ch, на самом деле в дело вступает адресная арифметика и происходит смещение адреса начала массива на число, которое содержится в ch. Допустим в ch лежит пробел, тогда выражение "" + ch будет вычислять вот это "" + 32, т.к. 32 - это код символа пробела в ASCII. Т.е. адрес начала массива сместится на 32 байта. Естественно, это уже далеко за пределами допустимого, т.к. в массиве всего один элемент. Ничего хорошего от такого кода можно не ждать.
А вот второй вариант - это совсем другое.
В первой строке мы инициализируем строковым литералом (т.е. массивом и 1 элемента) наш объект s типа std::string, т.е. содержимое массива копируется во внутренний буфер s. А затем через перегруженный оператор+ уже для объекта s делается конкатенация (добавление) символа к внутреннему буферу объекта.

Разницу в типах для применения оператора+ выделил полужирным.
1
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
30.12.2018, 09:50  [ТС]
Все равно не понимаю

Что бы хоть немного попытаться понять сделал вот так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
string Str1;
 
    cout << "length Str1:" << Str1.length() << " ;Sizeof(Str1): " << sizeof(Str1) << " ; Str1.Size(): "<< Str1.size() << endl;
 
string Str0 = "ssddddddddddddddddd";
 
Str1 = "";
 
    cout << "length Str1:" << Str1.length() <<" ;Sizeof(Str1): " << sizeof(Str1) <<" ; Str1.Size(): " << Str1.size() << endl;
 
Str1 = Str1 + Str0;
 
    cout << "length Str1:" << Str1.length() << " ;Sizeof(Str1): " << sizeof(Str1) <<" ; Str1.Size(): " << Str1.size() << endl;
И соответственно вывод данных в консоли:

C++
1
2
3
length Str1:0    ; Sizeof(Str1):28    ; Str1.size():0
length Str1:0    ; Sizeof(Str1):28    ; Str1.size():0
length Str1:19    ; Sizeof(Str1):28    ; Str1.size():19
То есть, когда я объявляю string Str1, и беру sizeof от Str1 - вывод показывает - 28. 28 чего ? Элементов, байт, бит ? И почему 28 ?
После присвоения Str1 = ""; ничего не меняется.
После объедения с Str0, Sizeof остается прежним 28, но уже меняется length и size с нуля на 19, 19 чего и почему 19 ?

в край уже запутался.

Добавлено через 45 минут
19 - это элементов String или же байт, но что такое 28 еще не могу понять.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.12.2018, 09:50
Помогаю со студенческими работами здесь

Приведение переменной типа object к переменной производного типа в приложенном коде
Добрый день! Столкнулся с проблемой. Есть обработчик события. Обработчик события общий для двух издателей, но издатели разного типа(Пусть...

Ошибка в объявлении переменной типа bool — "bool undeclared"
Доброго времени суток. #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;string.h&gt; void fileop(); void open(); void save(); ...

Символы в переменной типа bool и в условии
что обозначают третья и четвёртая строки в данном куске кода? for (i = 0; i &lt; array.Length; ++i) { ...

Присвоить переменной типа bool? значение null
Добрый день! Имеется mysql БД с таблицей, значение поля (тип int(1) по умолчанию NULL) может быть 0,1,null Нужно это значение...

Видимость переменных в методе в возвращение переменной типа bool
Всем Привет! Подскажите пожалуйста сделал небольшую программу в ней вызвал созданный класс Программа и класс должны делать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru