Hox!
Onko mahdollista käyttää getchar()-funkitiota luettaessa binääri-muotoista dataa stdin:stä.Kun pitäisi pystyä lukemaan merkki kerrallaan tekstiä ja binääri-muotoista dataa stdinnistä.
Jos getchar ei tule kysymykseen, niin onko ehdotuksia ??
Onko mahdollista käyttää getchar()-funkitiota luettaessa binääri-muotoista dataa stdin:stä.Kun pitäisi pystyä lukemaan merkki kerrallaan tekstiä ja binääri-muotoista dataa stdinnistä.
Jos getchar ei tule kysymykseen, niin onko ehdotuksia ??
Vastaukset 9
Vanhimmat
Kyllä pystyy. Muista vain tarkistaa paluaarvo (getchar() palauttaa EOF, jos tulee virhe tai tiedoston loppu).
unsigned char buf[512]={0};
int c;
int x = 0;
while ((c = getchar()) != EOF )
buf[x ] = c;
Lukee kyllä tekstitiedoston(merkki kerrallaan) oikein stdin:stä, mutta binääri-tiedostosta(esim.jpg) vain 4 ensinmäistä merkkiä.
Toivottavasti joku fiksumpi osaisi neuvoa ?
Mitenkäs yrität sitä stdin:iä tuolle ohjelmallesi syöttää? Itse testasin pikaisesti seuraavaa:
#include
int
main(void)
{
' int c;
'
' while ((c = getchar()) != EOF)
' putchar(c);
' return 0;
}
Ja ajoin sen:
prompt$ ./a.out < /usr/bin/true > true.2
Ja noiden MD5- summat matchaa.
Jos et saa vieläkään toimimaan niin postaa koko koodi tänne ja myös vinkki, miten yrität sitä käyttää.
Text and Binary Mode File I/O:
File I/O operations take place in one of two translation modes, text or binary, depending on the mode in which the file is opened. Data files are usually processed in text mode. To control the file translation mode, you can:
Retain the current default setting and specify the alternative mode only when you open selected files.
Change the default translation mode directly by setting the global variable _fmode in your program. The initial default setting of _fmode is _O_TEXT, for text mode.
When you call a file-open function such as _open, fopen, freopen, or _fsopen, you can override the current default setting of _fmode by specifying the appropriate argument to the function. The stdin, stdout, and stderr streams always open in text mode by default; you can also override this default when opening any of these files. Use _setmode to change the translation mode using the file handle after the file is open.
Eli vika tulee todennäkäisesti siitä että avaat binääritiedoston teksti-moodissa binäärimoodin sijasta)
Eh, kyseessä oli siis stdin. Eli standard input -virta, jonka käyttis avaa automaattisesti kun prosessia aletaan suorittamaan. Lisäksi getchar() ei edes ota parametriksi muita tiedostokahvoja vaan on itseasiassa makro getc(stdin).
Tosin olisi hyvä, jos mainitsisit käyttöjärjestelmän myös (meinaan windows ei tuon suhteen taida olla ihan samanlainen).
Routine Remarks
getc Same as fgetc, but implemented as a function and as a macro.
getwc Wide-character version of getc. Reads a multibyte character or a wide character according to whether stream is opened in text mode or binary mode.
getchar Same as _fgetchar, but implemented as a FUNCTION and as a MACRO.
getwchar Wide-character version of getchar. Reads a multibyte character or a wide character according to whether stream is opened in text mode or binary mode.
Eli getchar() on implementoitu sekä funktiona että makrona (makron etu nopeus, haitta lisää koodin kokoa). Totta on että oletuksena käytetään makroa, on monta tapaa funktion käyttöä (esim int c =(getchar)();)
Käyttis on Windows, kommentit suoraan kopioitu MS-Visual C MSDN-kirjastosta.
stdin, stdout ovat virtuaalitiedostoja jotka kyllä ottavat tiedostokahvoja, sinä et vaan näe niitä. stdin oletusmoodi on teksti, miten näppiksestä syötät binääritietoa?
Miksi määrittelisit tiedostokahvaa? getc() käyttää samaa tiedostokahvaa (näppis) kunnes se muutetaan. fgetc(FILE*stream) ottaa erillisen tiedostokahvan, ehkä se on sitä mitä tässä on yritetty tehdä? Tällöin täytyy varmista että tiedostokahva on luotu attribuuteilla binäri (-b) ei teksti (joka on oletus).
Niin ja standardi sanoo, että getchar = getc(stdin), ja molemmat _voidaan_ implementoida makroina.
> stdin, stdout ovat virtuaalitiedostoja jotka kyllä
> ottavat tiedostokahvoja, sinä et vaan näe niitä.
> stdin oletusmoodi on teksti, miten näppiksestä
> syötät binääritietoa?
Öh, stdin, stdout ja stderr ovat tiedostoja, jotka vaan sattuvat lukemaan/kirjoittamaan oletuksena näppiksestä/näytölle (tosin tuon voi muuttaa). Tiedostokahvoja noille on aika hankala antaa (ovat tyyppiä FILE *, joka on itsessään "kahva"). Huom. että descriptori on nimenomaan *se* kahva, jolla käyttöjärjestelmä (tässä Unix) erottelee nuo keskenään.
Binääritietoa on helppo syöttää stdin:in kautta esim:
./a.out < /bin/ls
Unix ei erottele binääritiedoston ja tekstitiedoston välillä kun taas windows näin tekee.
> Miksi määrittelisit tiedostokahvaa?
En oikein tässä ymmärrä mitä tarkoitat. Missä vaiheessa joku yritti "määritellä" jotain "tiedostokahvaa"?
sinulle kova pähkinä!
Onneksi on enemmän nakinmyyjien paikkaa vapaana kuin ohjelmoijen (oikeitten).
Eli kaililla mausteilla, kiitos!
Koska tämä ilmeisesti on kaikille tuntermaton, kerron taustan:
Pointteri pointeriin (=handle) saattaa tuntua turhaalta. Miksi se on välttämätön?
Ajatellaan! Muuttuja jonka sisällä on osoite"itäinen rantakatu 40" (Aivan oikeín, vanhan Sointu Oy:n osoite). Jos firma muuttaa, muuttaa nimensä tms ei välitetä yhtään siitä; pidetään ainoastaan jäljittämiseen tarvittavat tiedot ajan tasalla.
Tietokoneessa on aina tungosta. Kaikki haluavat muistia, kaikille sitä ei riitä. Mitä tehdään?
Käyttöjärjestelmä siirtää alueen missä varsinainen sisältö on(alkaa osoitteesta 65, siirretään osoitteseen 120), Tällöin myös osoite alueeseen muuttuu, eli muuttuja osoite-alueeseen vaihtaa arvoa 65->120. Jos möys osoiteavaruus vaihtuu? Postinumeroluettelot menevät arvottomiksi? Tietokone rakenne ei tästä lannistu: Selkein sanoin sen voisi kuvata näin: tiedän mistä sen aikaisemmin löysin...
Eli muuttuja kahva: (pointer to pointer): sisältö meni uuteen paikkaan, ei ole väliä kunhan tiedän mistä osoitteesta löydän osoitten uuteen dataan (oliko missä tahansa). Ellet tiedä missä osoite sijaitsee, silloin olet todella menettänyt otteesi ohjelmasta!
Se ohjelma mitä parhaillaan käytetään saa reippaasti enemmän muistia kuin muut: Tavallisesti tämä strategia riittää, ei kuitenkaan aina!