Ошибка при cout в с

I ran across this error after just having installed vs 2010 and just trying to get a nearly identical program to work.

I’ve done vanilla C coding on unix-style boxes before, decided I’d play with this a bit myself.

The first program I tried was:

#include "stdafx.h"


int _tmain(int argc, _TCHAR* argv[])
{
    cout << "Hello World!";
    return 0;
}

The big thing to notice here… if you’ve EVER done any C coding,

int _tmain(int argc, _TCHAR* argv[])

Looks weird. it should be:

int main( int argc, char ** argv )

In my case I just changed the program to:

#include <iostream>
using namespace std;

int main()
{
     cout << "Hello world from  VS 2010!n";
     return 0;
}

And it worked fine.

Note: Use CTRL + F5 so that the console window sticks around so you can see the results.

I realize that there are several duplicates like this but none of them have worked for me so far.
I am trying to compile a C++ very simple program on Ubuntu using g++ but it is giving me scope errors.

#include <iostream>
using namespace std;

int main()
{
  cout << "Hello world";
}

This gives me this error:

sudo g++ -v test.c
test.c: In function ‘int main()’:
test.c:7:3: error: ‘cout’ was not declared in this scope

I also tried defining the scope as many other posts say, but that also didn’t work, but gave me a different error:

#include <iostream>

int main()
{
  std::cout << "Hello world";
}

Gives error:

test.c: In function ‘int main()’:
test.c:6:3: error: ‘cout’ is not a member of ‘std’

Most of the suggestions online suggest «using namespace std;», «#include » and «std::cout».
So I tried all 3 together, still no luck :(

#include <iostream>
using namespace std;

int main()
{
  std::cout << "Hello world";
}

gives error:

test.c: In function ‘int main()’:
test.c:7:3: error: ‘cout’ is not a member of ‘std’

I have gone through several forums online but none of them seem to work for me :(

This is a part of a bigger issue because of which one of my linux make doesn’t work.

Btw, I am using g++ and not gcc as a few posts messed up.


EDIT 1:

I changed the name to .cpp, and execute without sudo. Here is the verbose output:

pranoy@pranoyubuntu1210:~/Desktop/SIP/SIPp/sipp-3.3$ g++ -v test.cpp -o test
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.7/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.7.2-2ubuntu1' --with-bugurl=file:///usr/share/doc/gcc-4.7/README.Bugs --enable-languages=c,c++,go,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.7 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.7 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --enable-plugin --enable-objc-gc --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.7.2 (Ubuntu/Linaro 4.7.2-2ubuntu1) 
COLLECT_GCC_OPTIONS='-v' '-o' 'test' '-shared-libgcc' '-mtune=generic' '-march=x86-64'
 /usr/lib/gcc/x86_64-linux-gnu/4.7/cc1plus -quiet -v -imultiarch x86_64-linux-gnu -D_GNU_SOURCE test.cpp -quiet -dumpbase test.cpp -mtune=generic -march=x86-64 -auxbase test -version -fstack-protector -o /tmp/cczzibvL.s
GNU C++ (Ubuntu/Linaro 4.7.2-2ubuntu1) version 4.7.2 (x86_64-linux-gnu)
    compiled by GNU C version 4.7.2, GMP version 5.0.2, MPFR version 3.1.0-p3, MPC version 0.9
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"
ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../x86_64-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/include/c++/4.7
 /usr/include/c++/4.7/x86_64-linux-gnu
 /usr/include/c++/4.7/backward
 /usr/lib/gcc/x86_64-linux-gnu/4.7/include
 /usr/local/include
 /usr/lib/gcc/x86_64-linux-gnu/4.7/include-fixed
 /usr/include/x86_64-linux-gnu
 /usr/include
End of search list.
GNU C++ (Ubuntu/Linaro 4.7.2-2ubuntu1) version 4.7.2 (x86_64-linux-gnu)
    compiled by GNU C version 4.7.2, GMP version 5.0.2, MPFR version 3.1.0-p3, MPC version 0.9
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: 521527ea42f0901bf839bcaad0cb13e6
test.cpp: In function ‘int main()’:
test.cpp:5:3: error: ‘cout’ is not a member of ‘std’

#Руководства

  • 4 июн 2020

  • 12

Разбираемся, как правильно использовать ввод данных, чтобы ничего не сломалось.

 vlada_maestro / shutterstock

Евгений Кучерявый

Пишет о программировании, в свободное время создаёт игры. Мечтает открыть свою студию и выпускать ламповые RPG.

Это четвёртая часть из серии статей «Глубокое погружение в C++». В прошлый раз мы познакомились с ветвлением и условными конструкциями. Сейчас поговорим о том, как сделать программу более полезной за счёт ввода данных и обработки исключений.

Если программа работает с изначально заданными данными, то она полезна только один раз, потому что результат будет всегда один и тот же. Гораздо эффективнее она становится, когда можно использовать разные данные:

  • числа для вычисления;
  • команды пользователя;
  • изображения;
  • аудио и видео;
  • текст и так далее.

Как получить и обработать данные через консоль? Давайте пробовать.

В самом начале кода каждой программы мы подключаем библиотеку iostream Input/Output Stream (поток ввода/вывода). Именно в ней находится команда cout, что позволяет выводить данные на экран консоли. В ней же есть команда cin, которая, наоборот, запрашивает пользовательский ввод.

Давайте напишем простую программу, которая спрашивает имя пользователя.

#include <iostream>

int main()
{
    std::string name;

    std::cout << "Enter your name: ";

    std::cin >> name;

//С помощью одной команды cout можно вывести несколько значений
    std::cout << "Hello, " << name << "! n";
}

Сначала мы объявили переменную name строкового типа, а потом сказали пользователю, что именно нужно ввести, и в конце выдали сообщение «Hello, %name%!». Это выглядит так:

Важно! Старайтесь всегда сообщать пользователю, какие действия от него требуются и что происходит в программе.

Также вы можете запросить от пользователя данные других типов. Например, числовые:

int a, b, c;

std::cout << "Enter a: ";
std::cin >> a;

std::cout << "Enter b: ";
std::cin >> b;

c = a + b;

std::cout << a << " + " << b << " = " << c;

Получается простейший калькулятор:

Это работает с символами, числами с плавающей запятой и другими данными.

Как мы уже говорили в первой статье, компьютер может только выполнять инструкции. Когда что-то идёт не по плану, он не способен самостоятельно решить, что ему делать, поэтому выдаёт ошибку.

Допустим, нам нужно, чтобы пользователь ввёл свой возраст. Мы ожидаем число вроде 8, 15 или 21, но кто-то может ввести эти числа прописью, например «двадцать один». Для программы эти варианты будут неожиданными, потому что она уже подготовила переменную типа int строка в неё никак не влезет.

Чтобы избежать таких ошибок, любые данные от пользователей стоит принимать как строку, а потом переводить в нужный нам тип. Процесс преобразования данных из одного типа в другой называется конвертацией.

В C++ самый простой способ конвертировать строку в число — использовать функцию stoi () или аналогичную:

std::string ageInput;
int age;

std::cout << "How old are you: ";
std::cin >> ageInput;

//В круглых скобках функции указывается значение, которое нужно конвертировать
age = stoi(ageInput);

std::cout << "You are " << age << " years old. n";

Вот пример корректной и некорректной конвертации:

Как видно на скриншоте, в первом случае всё прошло успешно, но в следующих случаях программа выдала ошибку. Давайте рассмотрим последнюю:

Разберём некоторые моменты подробнее:

  • Исключение (exception) — это что-то вроде ошибки, но не совсем. Разные части программы могут «выбрасывать» их при определённых условиях, чтобы сказать: что-то идёт не так; в данном случае — out of range (выход из диапазона). Это исключение было выброшено, потому что введённое число больше, чем может поместиться в переменную типа int.
  • Дамп памяти (memory dump) — это содержимое рабочей памяти одного процесса, ядра или всей операционной системы. Дамп можно посмотреть, чтобы понять, каким было состояние программы и почему она аварийно завершила работу.

Чтобы программа не закрывалась при выбрасывании исключений, их нужно обработать.

Для этого нам пригодится конструкция try-catch.

Вот код программы, которая проверяет корректность введённых данных:

std::string ageInput;
int age = 0;

std::cout << "How old are you: ";
std::cin >> ageInput;

//Названия исключений можно посмотреть в сообщениях об ошибке
try
{
    age = stoi(ageInput);
}
catch(std::invalid_argument) 
{
    //Говорим, что можно вводить только числа
    std::cout << "Only numbers are allowed! n";
}
catch(std::out_of_range)
{
    //Говорим, что число слишком большое
    std::cout << "You can't be that old! n";
}
catch(...)
{
    //Если будет выброшено какое-то исключение, которое не обработано выше, то говорим, что возникла неизвестная ошибка
    std::cout << "Unknown error! n";
}

if(age > 0)
{
    std::cout << "You are " << age << " years old. n";
}
else
{
    std::cout << "Try again! n";
}

Теперь можно запустить её и попробовать ввести любые значения — программа определит, какое сообщение вывести, и благополучно завершится.

С помощью пользовательского ввода можно по-настоящему раскрыть возможности условных конструкций. Например, конструкция switch позволяет создать простое консольное меню.

int action = 0;

//Выводим меню
std::cout << "===Calculator++==n1 - Additionn2 - Subtractionn3 - Divisionn4 - Multiplicationn5 - Quadratic equationnAction: ";

//Допускаем, что ввод будет верным
std::cin >> action;

switch(action)
{
    case 1:
   	 //Сложение
   	 break;

    case 2:
   	 //Вычитание
   	 break;

    case 3:
   	 //Деление
   	 break;

    case 4:
   	 //Умножение
   	 break;

    case 5:
   	 //Квадратные уравнения
	std::cout << 
   	 break;
}

Теперь можно прописать разные инструкции для каждого из этих действий.

Конструкция if пригодится для решения квадратных уравнений:

double a, b, c, d, x1, x2;

std::cout << "ax^2 + bx + c = 0n";

std::cout << "a = ";
std::cin >> a;

std::cout << "b = ";
std::cin >> b;

std::cout << "c = ";
std::cin >> c;

d = (b * b) - 4 * a * c;

std::cout << "d = " << b << "^2 - 4 * " << a << " * " << c << "n";
std::cout << "d = " << d << "n";

if(d > 0)
{
    //Для работы функции sqrt() нужно подключить библиотеку cmath
    x1 = (-b + sqrt(d)) / (2 * a);
    x2 = (-b - sqrt(d)) / (2 * a);

    std::cout << "x1, x2 = (-" << b << " +- sqrt(" << d << ")) / (2 * " << a <<")n";
    std::cout << "x1 = " << x1 << "nx2 = " << x2 << "n";
}
else if(d == 0)
{
    x1 = -(b / (2 * a));
    std::cout << "x1, x2 = -(" << b << " / (2 * " << a << ")n";
    std::cout << "x1, x2 = " << x1 << "n";
}
else if(d < 0)
{
    std::cout << "No roots! n";
}

Такие программы сильно упрощают жизнь не только учёным и инженерам, но и школьникам:

Мы научились запрашивать данные у пользователя, проверять, правильного ли они типа, и впервые воспользовались функцией. В следующей статье научимся писать собственные функции.

Научитесь: Профессия Разработчик на C++ с нуля
Узнать больше

DeHaker

@DeHaker

Только начал изучать C++

Вот весь код:

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

bool IsLoggedIn()
{
	string username, password, un, pw;
	cout << "Enter username: "; cin >> username;
	cout << "Enter password: "; cin >> password;

	ifstream read("D:\" + username + ".txt");
	getline(read, un);
	getline(read, pw);

	if (un == username && pw == password)
	{
		return true;

	}
	else
	{
		return false;
	}
}


int main()
{
	int choice;

	cout << "1: Registern2: Loginn Your choice: "; cin >> choice;
	if (choice == 1)
	{
		string username, password;

		cout << "select a username: "; cin >> username;
		cout << "select a password: "; cin >> password;

		ofstream file;
		file.open("D:\" + username + ".txt");
		file << username << endl << password;
		file.close();

		main();
	}
	else if (choice == 2)
	{
		bool status = IsLoggedIn();

		if (!status)
		cout << "False Login!n";
		system("pause");
		return 0;
	}
	else
	{
		cout << "Succesfully logged in!n";
		system("pause");
		return 1;
	}
}
Вроде ведь всё верно написано.


  • Вопрос задан

    более года назад

  • 531 просмотр

Ты не вызывал показ сообщения в случае успеха. Немного причесал код и удалил то, что ты можешь просто скопировать из своего кода обратно. Я бы на твоём месте сразу учился писать код так, чтобы каждая функция отвечала за какой-то свой один функционал. Не смешивай всё в одном месте.

#ifdef _WIN32
#include <windows.h>
#endif

#include <iostream>
#include <fstream>
#include <string>

bool IsLoggedIn()
{
    using namespace std;

   // ...

    return un == username && pw == password;
}

int main()
{
    using namespace std;

#ifdef _WIN32
    // https://habr.com/ru/sandbox/108750/
    // Устраняет проблемы выводом кириллицы на консоль Windows
    // Файл должен быть сохранён с кодировкой Windows 1251
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
#endif

    int choice;
    do
    {
        cout << "1: Registern2: Loginn Your choice: ";
        cin >> choice;

        if (choice == 1)
        {
            // ...
        }
        else if (choice == 2)
        {
            bool status = IsLoggedIn();
            if (!status)
            {
                cout << "False Login!n";
            }
            else
            {
                cout << "Succesfully logged in!n";
            }

#ifdef _WIN32
            system("pause");
#endif
            return status ? 1 : 0;
        }

    } while (choice == 1);
}

Пригласить эксперта


  • Показать ещё
    Загружается…

14 июн. 2023, в 01:02

5000 руб./за проект

13 июн. 2023, в 23:37

1000 руб./в час

13 июн. 2023, в 23:22

15000 руб./за проект

Минуточку внимания

Suppose in a C++ program, you are doing this but nothing appears in the console or terminal window.

std::cout << «running 1 ..»;

This may happen because std::cout is writing to output buffer which is waiting to be flushed.
If no flushing occurs nothing will print.

So you may have to flush the buffer manually by doing the following:

        std::cout.flush();

However, if you call std::endl at the end, then it will invoke the flush, so you wouldn’t have to call it manually.

If you write std::cout << «running 1 ..» << std::endl;

You would see output is now showing in the console or terminal window.

Thanks https://dev.to/cnskn for pointing it out.

Понравилась статья? Поделить с друзьями:
  • Ошибка при connect к mysql
  • Ошибка при chkdsk 766f6c756d652e63 470
  • Ошибка при asn 1 декодировании
  • Ошибка при apt update termux
  • Ошибка при 0303 и 0300