Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Premier Energy se listeaza la bursa

Unde recomandati un CT cu Casa de...

Adaptare masina pentru o persoana...

Bios laptop Myria MY8315
 Folie display laptop in Bucuresti?

Pagina Wikipedia

Incalzire cu Boiler cu PDC + IPAT...

Salariu de șofer Uber 8000 l...
 Problema token semnatura electron...

Incarcator diy China

Unde au disparut tancurile federa...

RMN Decontat
 Jgheab clasic forma "U"- ...

Reparatie plafoniera LED

Problema PC - se blocheaza sau re...

Notebook HP 840G2 - Upgrade RAM, ...
 

Cum functioneaza Ctrl+Z+Enter in C++

- - - - -
  • Please log in to reply
6 replies to this topic

#1
danb1961

danb1961

    Senior Member

  • Grup: Senior Members
  • Posts: 6,531
  • Înscris: 09.03.2002
#include <iostream>
#include<conio.h>
#include <fstream>
using namespace std;
char ch,nume[20];
fstream f("belea.in", ios::out);
int main()
{
  while(cin>>ch) f<<ch;
  f.close();
}
Iesirea din While se face cand expresia (cin>>ch)== 0; la apasare Ctrl+z(26 ascii)+Enter(13 ascii), facand abstractie de Enter care este folosit de cin pentru validare input, ch ar avea valoarea 26...totusi expresia (cin>>ch) este evaluata la 0(false)
Unde gresesc, care este explicatia.
Multumesc

#2
_Smiley_

_Smiley_

    Guru Member

  • Grup: Senior Members
  • Posts: 20,074
  • Înscris: 24.02.2006
combinatia respectiva nu este procesata de aplicatia ta, care se opreste din alta cauza.
https://msdn.microso...1(v=vs.85).aspx

Edited by _Smiley_, 17 January 2017 - 10:40.


#3
danb1961

danb1961

    Senior Member

  • Grup: Senior Members
  • Posts: 6,531
  • Înscris: 09.03.2002
Partial cred ca ai dreptate, anumite combinatii de taste sunt interpretate de SO, totusi programul nu se opreste, expresia este evaluata  si se continua executia programului cu urmatoare instr. f.close()

#4
sags

sags

    Guru Member

  • Grup: Senior Members
  • Posts: 10,005
  • Înscris: 24.04.2013
@_Smiley_: Nu vad ce legatura are cu Ctrl+C sau Ctrl+Break. Aici e vorba de Ctrl+Z

Motivul e probabil ca, din vremuri imemoriale, Ctrl+Z semnaleaza sfarsit de fisier. De la consola nici nu ai cum altfel sa marchezi sfarsit de fisier. Pentru fisiere disc in prezent se foloseste de regula lungimea lui, in bytes, pentru a-i detecta sfarsitul. Dar nici aici nu a fost intotdeuna asa. In CP/M de exemplu lungimea fisierelor pe disc era indicata in numar de sectoare, un sector avand (la vremea respectiza, pe floppy-discurile de 8") 128 de bytes. Deci in cazul unui fisier text nu avea lungimea multiple de 128 singura solutie era ca spatiul in plus din ultimul sector sa fie umplut cu Ctrl+Z (sau macar pus un Ctrl+Z, apoi dupa el era ‘gunoi’).

De ce tocmai Ctrl+Z? In standardul ASCII, Ctrl+Z se numeste de fapt EOF adica ‘End Of File’…



LE: Pe de alta parte, esti sigur ca din while(){} se iese pe conditia de == 0 si nu ca urmare a semnalarii unei exceptii? (Nu pot testa acum sa vad exact.) Nu de alta, dar operatorul >> ar trebui sa intoarca o referinta la cin, deci nu vad cum poate fi NULL. Ca urmare a exceptiei, care nu este tratata, se iese din program iar sistemul de operare inchide automat toate fisierele lasate ‘agatate’, deci si "belea.in".

Edited by sags, 17 January 2017 - 11:35.


#5
danb1961

danb1961

    Senior Member

  • Grup: Senior Members
  • Posts: 6,531
  • Înscris: 09.03.2002
Programul se termina in consola cu mesajul :Process returned 0 (0x0) execution time : ....Press any key to continue; Din cate stiu, pe CodeBlocks 0=fara erori. Si repet , conditia este evaluata si programul nu se termina, continuand cu executia urmatoarei instructiuni.
PS Ctrl+Z "forteaza " iesirea"/evaluarea din while, numai daca este primul caracter pe linie;in caz contrar,daca  are inainte ,pe aceeiasi linie, un caracter,  scrie in fisier ->(sageata)

Edited by danb1961, 17 January 2017 - 12:32.


#6
sags

sags

    Guru Member

  • Grup: Senior Members
  • Posts: 10,005
  • Înscris: 24.04.2013
M-am uitat la codul generat si am gasit o explicatie. E adevarat ca motivul de baza este ca acel Ctrl+Z la inceput de linie e luat de sfarsit de fisier si, fiind la inceput de linie, cin nu are nimic disponibil pentru citit - nu a obtinut nici un buffer de la tastatura. operator >> intoarce intr-adevar o referita la cin. Mai departe insa pentru a testa conditia se aplica un operator void * pe aceasta referinta, iar acest operator arata cam asa:
std::ios_base::operator void *() const {
	return (fail() ? 0 : (void *)this);
}
De aici explicatia: fiindca nu a putut citi nimic, failbit este setat si deci conversia intoarce NULL. Din ce am trasat sunt setate failbit si eofbit, dar numai failbit | badbit sunt examinate pentru a decide daca intoarce NULL sau nu.

Intr-adevar imi pare cam ciudat ca un Ctrl+Z precedat de caractere ‘normale’ este tratat si el ca un caracter ‘normal’ (copiat in ch) si nu ca sfarsit de fisier. Nu am sapat mai mult, poate e o conventie in acest sens pe undeva sau poate e un bug

#7
sags

sags

    Guru Member

  • Grup: Senior Members
  • Posts: 10,005
  • Înscris: 24.04.2013
LE: Am gasit prin specificatii explicatia cum functioneaza operator void * (pre- C++11) si operator bool (post C++11) pe stream-uri aici <http://en.cppreferen...s/operator_bool>, si se confirma ce am remarcat mai sus despre utilizarea unei referinte la cin pe post de test.

Anunturi

Chirurgia endoscopică a hipofizei Chirurgia endoscopică a hipofizei

"Standardul de aur" în chirurgia hipofizară îl reprezintă endoscopia transnazală transsfenoidală.

Echipa NeuroHope este antrenată în unul din cele mai mari centre de chirurgie a hipofizei din Europa, Spitalul Foch din Paris, centrul în care a fost introdus pentru prima dată endoscopul în chirurgia transnazală a hipofizei, de către neurochirurgul francez Guiot. Pe lângă tumorile cu origine hipofizară, prin tehnicile endoscopice transnazale pot fi abordate numeroase alte patologii neurochirurgicale.

www.neurohope.ro

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate