Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Почему цикл for срабатывает 2 раза? Код в вопросе

Саша Коффейко Знаток (426), закрыт 1 год назад
SetConsoleCP(1251);

SetConsoleOutputCP(1251);


const int Bukvi = 1000000;

char Slovo[Bukvi];


string Path;

string Name;


fstream fs;

ofstream of;


cout << ("Введите путь куда вы хотите создать файл: ");

cin >> Path;

cout << ("Введите название файла с расширеннием: ");

cin >> Name;


of.open (Path + "/" + Name, ofstream::app);




if (! of.is _open())

{

cout << ("Ошибка! Файл не был создан. \n \n");

cout << ("Код ошибки: 00001\n\n\n\n\n");

}

else

{

cout << ("Файл создан в: " + Path + "/" + Name + "\n\n");

for (int lol = 0; lol < 5; lol++)

{

cout << ("Введите что вы хотите вписать в файл: ");

cin.getline(Slovo, Bukvi);


of << (Slovo);

of << ("\n");

}

}


тоесть он выводит Введите что вы хотели вписать два раза
Лучший ответ
Άηϑρέΰ ҂ Искусственный Интеллект (179793) 1 год назад
потому что в цикле, сколько раз цикл пройдется, столько и выведется
Саша КоффейкоЗнаток (426) 1 год назад
Вы не правильно поняли
Остальные ответы
Капитан Кирк Оракул (96165) 1 год назад
не знаю с++ но по ощущениям там какой то оператор в теле цикла - после надписи - можно выполнять только один раз. А при попытке выполнить второй раз цикл прерывается.
Саша КоффейкоЗнаток (426) 1 год назад
Да не, он как нужно работает только 5 раз, проблема на фото
Капитан Кирк Оракул (96165) Саша Коффейко, ну самое простое начинать локализовывать проблему - в цикле отключать другие операторы и смотреть сколько раз выполнится. Вообще отладчиком смотреть нада
Андрей Высший разум (425166) 1 год назад
Потому, что совмещение в коде ввода через cin >> и ввода через cin.getline приводит к странным последствиям.

Можешь всё вводить через cin.getline, можешь перед циклом выполнить сброс буфера ввода (cin.ignore).
Саша КоффейкоЗнаток (426) 1 год назад
Оу, спасибо! Я поменял все cin'ы на cin.getline и все и в правду стало нормально работать!
Саша Коффейко Знаток (426) Саша Коффейко, Вернее не на cin.getline а на просто getline
Block Гуру (4439) 1 год назад
Перед
cin.getline(Slovo, Bukvi);

надо прочистить cin
cin.clear();
fflush(stdin);

То есть вот так:
cout << ("Введите что вы хотите вписать в файл: ");
cin.clear();
fflush(stdin);
cin.getline(Slovo, Bukvi);


Полный код для mingw (проверено на msys2):

#include <iostream>
#include <locale>
#include <codecvt>
#include <string>
#include <stdexcept>
#include <vector>
#include <fstream>
#include <sys/stat.h>
#include <windows.h>

using namespace std;


int main(int argc, char *argv[])
{
setlocale(LC_ALL, "Russian");


const int Bukvi = 1000000;

char Slovo[Bukvi];


string Path;

string Name;


fstream fs;

ofstream of;


cout << ("Введите путь куда вы хотите создать файл: ");

cin >> Path;

cout << ("Введите название файла с расширеннием: ");

cin >> Name;


of.open (Path + "/" + Name, ofstream::app);




if (! of.is_open())

{

cout << ("Ошибка! Файл не был создан. \n \n");

cout << ("Код ошибки: 00001\n\n\n\n\n");

}

else

{

cout << ("Файл создан в: " + Path + "/" + Name + "\n\n");

for (int lol = 0; lol < 5; lol++)

{

cout << ("Введите что вы хотите вписать в файл: ");

cin.clear();
fflush(stdin);
cin.getline(Slovo, Bukvi);


of << (Slovo);

of << ("\n");

}

}

return 0;
}

Компиляция через строку так:

g++ 1.cpp -DUNICODE -lopengl32 -LC:/msys32/mingw32/lib -lmingw32 -lmingw32 -ldxerr8 -ldinput8 -lshell32 -lsetupapi -ladvapi32 -luuid -lversion -loleaut32 -lole32 -limm32 -lwinmm -lgdi32 -luser32 -lm -Wl,--no-undefined -pipe -lmingw32
Похожие вопросы