cin

 ( Anonymous | 2003. május 18., vasárnap - 16:58 )

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Kedves 'gabaman'!

[quote:93614abe32="gabaman"]Ha mindenképpen külön akarod beolvasni az stdin-ről a fájlokat, akkor használj cat helyett echo-t:
echo "a_file b_file" | program
[/quote:93614abe32]
ezzel, a [b:93614abe32]program[/b:93614abe32] az STDIN-jén a következőket tudja beolvasni:
[quote:93614abe32]a_file b_file[/quote:93614abe32] 'garabonciás'-unk pedig a két file tartalmát szeretné olvasgatni...

[quote:93614abe32="gabaman"]Ilyenkor beolvasol egy sort, majd elválasztójelnek veszed azokat a szóközöket, amelyeket nem előz meg '\' jel. Utána már azt tehetsz a fájlnevekkel amit akarsz.[/quote:93614abe32] még egyszer, barátunk nem a file-nevekre kíváncsi, hiszen azokat hagyományosan és egyszerűbb módon megkaphatja parancssori paraméterként :?

[quote:93614abe32="gabaman"]Mellesleg nem az stdin, hanem a cat fűzi össze a fájlokat.[/quote:93614abe32] senki nem állította az ellenkezőjét, márt azér se, mert az STDIN egy komunikációs csatorna, egy 'meta' file, míg a 'cat' egy program, ami nevezetesen a 'program' ezen nevű csatornáját birizgálja...

[quote:93614abe32="gabaman"]Üdv:
gabaman[/quote:93614abe32]Üdv!

Kedves 'szaszg'!

Látom nagyon érzékenyen érint a probléma, inkább a megoldásra kellene több energiát fordítanod, mint inkább a nem kielégítő válaszok elemzésére. :oops:

[quote:af36ac4fc4]cat a_file b_file | program[/quote:af36ac4fc4]
Mint látható a "program' bemenete valójában egy pipe. Mint ahogy írtad az EOF a stream lezárása, így az STDIN-ről történő EOF beolvasás nem lehetséges. Ha módosítjuk az eredeti problémában a cin-t pipe-ra és az előbb felvázoltakat összekötögetjük, akkor a megoldás már egyszerű:
1. létre kell hozni egy named pipe-ot
2. a named pipe-ot fájlként sorozatosan be kell olvasni a programban
3. a benenetet a named pipe-ra kell küldeni

Csak a kilépést kell megoldani és készen van a megoldás.

Üdv:
gabaman

Hali [b:9e52059b03]gabaman[/b:9e52059b03]

A named pipe lehet megoldas, habar akkor is talalkozhatunk EOF problemakkal... Meg pontosan nem jartam utana, de peldaul a kovetkezo esetben nem lat EOF-ot a ket 'file' kozott:

[code:1:9e52059b03]program <named_pipe &
echo "alma" >named_pipe; echo "korte" >named_pipe[/code:1:9e52059b03]

de ha tartunk egy kis szunetet, mar minden jo:
[code:1:9e52059b03]program <named_pipe &
echo "alma" >named_pipe; sleep 1; echo "korte" >named_pipe[/code:1:9e52059b03]

Amugy szerintem a megoldas az, hogy a file-neveket a parancssorbol vesszuk fel, es szepen megnyitjuk, vegigolvassuk oket...

Dehat lehet probalkozni mindenfele csurcsavarokkal is... :lol:

Zsiraf

[quote:7c4164c591="szaszg"]
Ahoz az stdin-nek tényleg consol-ról, vagy valami olyan progiból kéne jönnie ami az első file után lezárja a STREAM-et (alias EOF)... Hiszen nincs lefoglalva az EOF-ra egy karakter, tehát file-ba, nem tudsz explicit EOF-ot elhelyezni :oops:
[/quote:7c4164c591]

en is ebben a hitben eltem, aztan kiderult, hogy ha egy fileba beleteszek egy 255 azaz 0xFF erteku byteot akkor azt EOFnak veszi! (gcc3.2) (textfilekent nyitom meg persze)

Hali!

Bocsi, hogy ferrevezettelek, mentsegemre szolgal, hogy a DOS ota nem foglalkoztam 'text' file-okkal (text<->binary)..

Amugy, imho ez nem a 'gcc' asztala, mivel a C/C++-on kivul helyezkedik el a file megnyitas/olvasas kerdeskor (cafoljatok meg, ha nem igy van!) Amugy az [b:5365cb597e]info libc[/b:5365cb597e] a kovetkezot mondja:[code:1:5365cb597e]Text and Binary Streams
=======================

The GNU system and other POSIX-compatible operating systems organize
all files as uniform sequences of characters. However, some other
systems make a distinction between files containing text and files
containing binary data, and the input and output facilities of ISO C
provide for this distinction. This section tells you how to write
programs portable to such systems.

When you open a stream, you can specify either a "text stream" or a
"binary stream". You indicate that you want a binary stream by
specifying the `b' modifier in the OPENTYPE argument to `fopen'; see
*Note Opening Streams::. Without this option, `fopen' opens the file
as a text stream.

Text and binary streams differ in several ways:

* The data read from a text stream is divided into "lines" which are
terminated by newline (`'\n'') characters, while a binary stream is
simply a long series of characters. A text stream might on some
systems fail to handle lines more than 254 characters long
(including the terminating newline character).

* On some systems, text files can contain only printing characters,
horizontal tab characters, and newlines, and so text streams may
not support other characters. However, binary streams can handle
any character value.

* Space characters that are written immediately preceding a newline
character in a text stream may disappear when the file is read in
again.

* More generally, there need not be a one-to-one mapping between
characters that are read from or written to a text stream, and the
characters in the actual file.

Since a binary stream is always more capable and more predictable
than a text stream, you might wonder what purpose text streams serve.
Why not simply always use binary streams? The answer is that on these
operating systems, text and binary streams use different file formats,
and the only way to read or write "an ordinary file of text" that can
work with other text-oriented programs is through a text stream.

In the GNU library, and on all POSIX systems, there is no difference
between text streams and binary streams. When you open a stream, you
get the same kind of stream regardless of whether you ask for binary.
This stream can handle any file content, and has none of the
restrictions that text streams sometimes have.
[/code:1:5365cb597e] Szoval nem ertem, mertha nincs kulonbseg a text es a binary kozott, akkor mi van azzal a 255-el??? Persze lehet, hogy a C++ -banez mashogy van...

Sziasztok engedjétek meg hogy elkezdjem a c/c++ forumot
rögtön egy problémával : :D
hogyan lehet a C++ -ban tobb fajlt beolvasni a cinrol ?
mondjuk hogy feldolgozzam a
cat a_file b_file | program
-ot

koszonettel
Garaboncias

Hali!

Hehe pont úgy ahogy a C-ben az STDIN-ről, ahogy írtad... :twisted: olvasol belőle

habár gondolom te arra vágysz, hogy az első file végét szeretnéd tudni :roll: Igaz? dehát a cin-cin csak [b:666d0a0dbf]egy[/b:666d0a0dbf] file, és egy file-nak csak egyszer van vége!!! :oops:

Szóval, ez kb olyan, mintha egy [u:666d0a0dbf]valami.txt[/u:666d0a0dbf] file-ba összemásolnál 2-100 file-t, majd megnyitnád és azt szeretnéd, hogy valaki megmondja neked hol voltak az eredeti file-határok. De ha a file-okban ez nem volt jelezve valamiféle módon, akkor sehonnét sem fogod többé megtudni!!!

Zsiráf

Na nem egeszen ...
az elso fajlt beolvassa (fajlvegevel a vegen) es aztan kesz nem lehet tobbet olvasni a cinrol :roll:
a masodik fajl teljesen elvesz ...

Elnézést
igazad volt ( ja sajna ez van egybeolvadnak )
:oops:
Garaboncias

Ha mindenképpen külön akarod beolvasni az stdin-ről a fájlokat, akkor használj cat helyett echo-t:
echo "a_file b_file" | program
Ilyenkor beolvasol egy sort, majd elválasztójelnek veszed azokat a szóközöket, amelyeket nem előz meg '\' jel. Utána már azt tehetsz a fájlnevekkel amit akarsz.

Mellesleg nem az stdin, hanem a cat fűzi össze a fájlokat.

Üdv:
gabaman

[quote:70b5325258="Anonymous"]Elnézést
igazad volt ( ja sajna ez van egybeolvadnak )
:oops:
Garaboncias[/quote:70b5325258]
Egyébként gondolom C++-ban is lehet eof-ot tesztelni.
Ti. olyan aranyosság is előfordulhat, hogy pl. a stdin-en eof van, és utána minden egyéb nélkül esetleg olvashatsz tovább.
Hogy ez hogy történhet?
Gondolj bele, hogy az stdin a terminálról jön.
Majd amikor a program stdin-jébe való bősz adatbejuttatást megelégelted nyomsz egy ctrl-d -t, ami ugye fájlvéget nyom.
Aztán nyomod tovább bőszen bele az adatokat.
És a program olvashat eof után is.
De hasonlók fordulhatnak elő, hogyha socketet programozol.

De annyi biztos, hogy én nem C++-ban programoznék ilyet.

Na ja,

De a példa ezt az esetet kizárja:

[quote:68ac1c6405]cat a_file b_file | program
-ot [/quote:68ac1c6405]

Ahoz az stdin-nek tényleg consol-ról, vagy valami olyan progiból kéne jönnie ami az első file után lezárja a STREAM-et (alias EOF)... Hiszen nincs lefoglalva az EOF-ra egy karakter, tehát file-ba, nem tudsz explicit EOF-ot elhelyezni :oops:

Zsiráf