Cin sync c что это
There are two problems with this code. Let’s look at the first problem — what happens when we type in two words?
Enter Text: Hello, World! Enter Number: Enter Another Number: You Entered: Hello,,
and the rest of the output would be undefined. This is because it only reads in stuff until a space, so the leftover text is there for when it tries cin >> n, which won’t work. To fix it, we can add cin.sync() after the cin >> str, which will synchronize the input stream with whatever has been entered.
The second problem is that this program would end before we saw the output — this can be fixed with cin.get() or cin.ignore(), but if the user typed in two things for Another Number, it would get that and end. To solve this, you can add cin.sync(); cin.ignore();, which will hold the window open until you press enter.

@L B
perfect example, thanx.
i used to use cin.get() but got hit by some strange behavior (i know it s dumb).
will it work the same after a getline(cin,stringname) ?
The difference between cin.ignore and cin.sync
cin.ignore discards characters, up to the number specified, or until the delimiter is reached (if included). If you call it with no arguments, it discards one character from the input buffer.
For example, cin.ignore (80, ‘\n’) would ignore either 80 characters, or as many as it finds until it hits a newline.
cin.sync discards all unread characters from the input buffer. However, it is not guaranteed to do so in each implementation. Therefore, ignore is a better choice if you want consistency.
cin.sync() would just clear out what’s left. The only use I can think of for sync() that can’t be done with ignore is a replacement for system («PAUSE»); :
cin.sync(); //discard unread characters (0 if none) cin.get(); //wait for input
With cin.ignore() and cin.get() , this could be a bit of a mixture:
cin.ignore (std::numeric_limits::max(),'\n'); //wait for newline //cin.get()
If there was a newline left over, just putting ignore will seem to skip it. However, putting both will wait for two inputs if there is no newline. Discarding anything that’s not read solves that problem, but again, isn’t consistent.
Как работает sync?
эм. скопировал код, скопировал в файл, запустил g++ имя-файла, потом запустил ./a.out. Вывело то, что Вы ожидаете.
12 июн 2018 в 15:56
@KoVadim да я в курсе, что на некоторых системах оно выводит то, что ожидается, но не понимаю почему. У вас что выводит f.sync()? 0?
12 июн 2018 в 16:02
Если у Вас не выводится надпись «Reading from the file, with sync()», то значит, что либо не тот бинарь компилируете, либо оно падает, либо я чего то не знаю о стандартной библиотеке
12 июн 2018 в 20:06
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
В вашем примере параллельного чтения и записи в один файл функция sync не спасёт, так как операционка не будет блокировать и синхронизировать бесконечный поток открытия файлов. После открытия файла на чтение все клиенты будут читать одно и то-же из буфера. При изменении файла следующие клиенты будут читать файл из буфера второго и тоже удивляться, что бабка Рая говорила другое. Результат чтения исходников и переводов. Функция sync обновляет буфер чтения до упора памяти. Если буфер заполнен полностью и ничего не добавилось всё остаётся точно так-же. Если файл изменился, то заново буфер обновлятся не будет. Если у вас было желание обновить содержимое буфера, то этот буфер нужно обнулить. Это можно достичь с помощью f.seekg(f.tellg()); . Более красивого способа не нашёл.
Отслеживать
ответ дан 12 июн 2018 в 20:07
17.2k 1 1 золотой знак 9 9 серебряных знаков 33 33 бронзовых знака
Но почему на одних операционках оно работает как в примере, а в других — нет? И в чем смысл этой функции?
12 июн 2018 в 20:14
В инструкции C++ пытался разжевать английский , там в примерах только cin и объясняли, что кэш операционки собственный сливает клиентской программе до упора. Можно поигратся с обновлением файла в режиме append и посмотреть результат.
13 июн 2018 в 6:07
Почитал файл заново без закрытия с помощью f.seekg(0); получил одинаково новые цифры что с sync что без. Инструкцию на русском надо раскопать по sync.
13 июн 2018 в 6:33
Если у вас было желание обновить содержимое буфера, то этот буфер нужно обнулить. Это можно достичь с помощью f.seekg(f.tellg()); . Более красивого способа не нашёл.
13 июн 2018 в 15:30
нет, подобного желания у меня не было) просто увидел эту функцию в коде и заинтересовался зачем она нужна. В том коде автор использовал ее неправильно: для обнуления буфера, из-зс чего у меня возникли проблемы на линуксе при выполнении проги. Хотел узнать что она вообще должна выполнять по стандарту — ну а дальше вы знаете)
Проверка вводимых потоковых данных С++
Если данные вводятся в формы – то правильный путь – использование валидаторов. Если данные считываются с файла в JSON/XML форматах используйте JSON-схему или XSD/DTD. Ну а эта инструкция посвящена работе с потоками типа cin, ifstream.
Валидация ввода чисел
Итак, мы считали целое число с консоли:
int a; cin >> a;
Что если пользователь ввел не целое число или строку? При этом поднимется флаг ошибки потока cin. Не вдаваясь в подробности, проверить его можно функцией cin.fail() . Но нам надо не просто проверить, а попросить пользователя ввести данные еще раз. Перед следующей попыткой ввода надо снять флаг ошибки функцией cin.clear() и удалить все находящиеся в нем данные. Для удаления данных можно использовать такую конструкцию: cin.ignore(cin.rdbuf()->in_avail()); или такую: cin.sync(); тут функция rdbuf возвращет буфер, а in_avail – количество байт в нем. Однако, это работает не всегда (не во всех компиляторах), in_avail часто возвращает некорректные значения. Вместо этого можно передать в ignore любое большое число, задающее число байт, которые надо пропустить. Удобен и переносим такой вариант: std::cin.ignore(std::numeric_limits
int a; cin >> a; while (cin.fail())< cin.clear(); std::cin.ignore(std::numeric_limits::max(), '\n'); cout > a; >
Валидация ввода строки
Допустим, мы думаем, что в файле находится строка не более чем из N символов. Считаем ее так:
char s1[N]; cin.getline(s1, N,'\n');
Что может пойти не так? – На самом деле, мы считываем строку не более чем из N символов или до символа перевода строки. Если перед этим мы считали с клавиатуры число (например как описано выше) – то в буфере остается символ перевода строки, так как оператор >> не удаляет его из потока. Часто для этого выполняют что-то типа cin.get() , однако более надежно вызвать что-то типа std::cin.ignore(std::numeric_limits
char s1[N]; std::cin.ignore(std::numeric_limits::max(), '\n'); cin.getline(s1, N,'\n'); if (cin.fail()) < cin.clear(); std::cin.ignore(std::numeric_limits::max(), '\n'); >
Этот вариант считывает с потока строку (не более чем из N символов), а остальные – игнорирует (до символа перевода строки). Однако, если вы хотите при некорректном ввода попросить пользователя ввести данные повторно, используйте такой вариант:
char s1[N]; std::cin.ignore(std::numeric_limits::max(), ‘\n’); cin.getline(s1, N,’\n’); while (cin.fail()) < cin.clear(); std::cin.ignore(std::numeric_limits::max(), '\n'); cout