Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.05.2012, 03:10   #1
kineziz
Форумчанин
 
Регистрация: 22.12.2011
Сообщений: 378
По умолчанию Буфер программы

Народ возник вопрос вот код (работающий нормально):
Код:
#include "stdafx.h"
#include <iostream>
#include <fstream>
using namespace std;

void CoderFunc(char *pFileName)
{
	char Number;
	cin.get();
	ofstream output(pFileName);
	cout << "Введите символы: ";
	while((Number = cin.get()) != '\n')
		output << (int)Number << ' ';
	output << '\n' << 0;
}
int main()
{
	setlocale(LC_ALL,"Russian");
	char FileName[256];
	cout << "Введите имя файла: ";
	cin >> FileName;
	CoderFunc(&FileName[0]);
	system("PAUSE");
	return 0;
}
а вот код который работает ненормально:
Код:
#include "stdafx.h"
#include <iostream>
#include <fstream>
using namespace std;

void CoderFunc(char *pFileName)
{
	char Number;
	ofstream output(pFileName);
	cout << "Введите символы: ";
	while((Number = cin.get()) != '\n')
		output << (int)Number << ' ';
	output << '\n' << 0;
}
int main()
{
	setlocale(LC_ALL,"Russian");
	char FileName[256];
	cout << "Введите имя файла: ";
	cin >> FileName;
	CoderFunc(&FileName[0]);
	system("PAUSE");
	return 0;
}
Разница в кодах в том что в одном коде в функции CoderFunc есть функция cin.get(); а в другом нет.
Так вот первый код работает как надо, а второй запускается и после вызова функции CoderFunc программа возвращается в main без ввода символов который должен быть.
Мне кажется когда в функции main я вводил имя файла и нажал интер(конец ввода как не так) и символ перехода на новую строку остался в буфере.
В первом коде этот буфер если я не ошибаюсь сбрасывается с помощью cin.get(); и запрашивает символ, а вот во втором коде символ записывается в переменную Number и тем самым не проходит условие цикла. Я правильно думаю?
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.
kineziz вне форума Ответить с цитированием
Старый 05.05.2012, 03:13   #2
kineziz
Форумчанин
 
Регистрация: 22.12.2011
Сообщений: 378
По умолчанию

Просто если использовать код без ввода имени файла, а начать сразу с ввода символа то работает нормально и без второго вызова cin.get()
Код:
#include "stdafx.h"
#include <iostream>
#include <fstream>
using namespace std;

int main()
{
	char Number;
	ofstream output("File.txt");
	cout << "Введите символы: ";
	while((Number = cin.get()) != '\n')
		output << (int)Number << ' ';
	output << '\n' << 0;
	system("PAUSE");
	return 0;
}
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.
kineziz вне форума Ответить с цитированием
Старый 05.05.2012, 03:58   #3
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Да совершенно верно, условие цикла не выполняется
while((Number = cin.get()) != '\n')
Так как в буфере последним символом идет '\n'
EUGY вне форума Ответить с цитированием
Старый 05.05.2012, 20:58   #4
kineziz
Форумчанин
 
Регистрация: 22.12.2011
Сообщений: 378
По умолчанию

Спасибо. А есть какой нить способ чтоб это предотвратить или все время сбрасывать последний символ буфера с помощью cin.get();
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.
kineziz вне форума Ответить с цитированием
Старый 05.05.2012, 20:59   #5
kineziz
Форумчанин
 
Регистрация: 22.12.2011
Сообщений: 378
По умолчанию

Я вроде слышал о командах типа очистить буфер или я что то путаю
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.
kineziz вне форума Ответить с цитированием
Старый 06.05.2012, 00:45   #6
Kaela
Пользователь
 
Регистрация: 29.04.2012
Сообщений: 36
По умолчанию

Цитата:
Сообщение от kineziz Посмотреть сообщение
Я вроде слышал о командах типа очистить буфер или я что то путаю
у меня была такая проблема
Просто создай массив char на сколько хочешь символов,хоть пустой
и в конце функции пускай его по функции cin.get()
в результаие не будешь захватывать '\n'
Kaela вне форума Ответить с цитированием
Старый 06.05.2012, 02:10   #7
kineziz
Форумчанин
 
Регистрация: 22.12.2011
Сообщений: 378
По умолчанию

а метод .sync не подойдет? ( cin.sync() )
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.

Последний раз редактировалось kineziz; 06.05.2012 в 02:15.
kineziz вне форума Ответить с цитированием
Старый 06.05.2012, 02:16   #8
kineziz
Форумчанин
 
Регистрация: 22.12.2011
Сообщений: 378
По умолчанию

Работает проверено. Вот код для примера:
Код:
#include "stdafx.h"
#include <iostream>
using namespace std;

int main()
{
	setlocale(LC_ALL,"Russian");
	char Symbol_1 = NULL;
	char Symbol_2 = NULL;
	cout << "Введите: ";
	cin >> Symbol_1;
	cin.sync();
	while((Symbol_2 = cin.get()) != '\n')
		cout << "Цикл начат. . ." << endl;
	system("PAUSE");
	return 0;
}
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.
kineziz вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C# Копирование участка программы в буфер как изображение Forcer Помощь студентам 5 04.07.2011 10:55
Кольцевой буфер KTOIA Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 6 01.11.2009 18:17
Строки в буфер AgressiveBehavior Общие вопросы Delphi 4 30.09.2009 11:07
Буфер Черничный Общие вопросы Delphi 5 10.09.2008 09:35