Kezdőoldal » Számítástechnika » Programozás » Az alábbi C++ problémám van....

Az alábbi C++ problémám van. Hogyan lehet a legoptimálisabban megoldani?

Figyelt kérdés

Egy file-ból szeretnék adatokat beolvasni. Amiben lehetnek kommentek ill. komment sorok. Elég egyszerű probléma, de mégsem látom sehol, hogy optimálisan csinálnák. Nagy file-okról van szó, ezért ne írjátok légyszi, hogy ne törődjek az optimalizálással!


Ha a getline-al beolvasom a sort, majd ellenőrzöm mondjuk a kezdő karaktert, hogy komment jel-e, és utána olvasom az adatokat mondjuk sstream-mel, akkor lényegében kétszer olvastam be a sort!


Ha tudnám, hogy nem komment sor, akkor olvashatnám be egyből az adatokat >>, de sajnos ezt előre nem tudom.


Megoldható valahogy, hogy a sor kétszeri feldolgozása nélkül leprogramozzam?



2012. aug. 14. 17:05
1 2
 11/16 A kérdező kommentje:
elvileg megoldható, igen, de erre nem tudok technikai megoldást, ilyent még sose láttam leprogramozva
2012. aug. 15. 23:02
 12/16 anonim ***** válasza:
de most tényleg az a probléma, hogy az első karaktert kétszer kell "feldolgoznod"? Ha tényleg ezzel van a gond, akkor ezért nem értem, ezt nem tudod kevesebből megcsinálni, és nem is kell.
2012. aug. 15. 23:47
Hasznos számodra ez a válasz?
 13/16 anonim ***** válasza:
Szóval te szerintem alapvetően a puffer működését nem érted, vagy azt nem, hogy mit szeretnél csinálni. char*-ba kerülnek az adatok, és gcount-tal tudod a hosszát. Az első karaktert kell megnézned, ami "valszeg" az első_paraméter[0] lesz :), ennnek függvényében pedig vagy átmásolod az egészet (strncpy) oda, ahova akarod, vagy beolvasod a következő sort. Ha ebből se derül ki számodra semmi, akkor én feladom, de kíváncsi leszek, ha sikerül megoldanod, hogy végülis mit szerettnél volna csnálni.
2012. aug. 15. 23:52
Hasznos számodra ez a válasz?
 14/16 A kérdező kommentje:
ha beolvastár egy karaktert és nem komment, akkor olvasol tovább. Meg egyébként is mert a sor vége jelig be kell olvasnod úgyis. A problémám, hogy technikailag pl ha egy számot kell beolvasnod, akkor azt fel kell ismerd. A standard >> bemeneti jel automatikus átalakító/felismerő funkcióját már nem használhatod, mert karakterenként olvasol. Stringstream-be szokták rakni, de akkor azt újra olvasod lényegében. Sőt maga a stringstream-be való betöltés is lehet hogy végigmegy az egészen mégegyszer, ezt nem tudom (s akkor az már 3). Szóval technikailag nem látok rá implementált megoldást/algoritmust/konténert, hogy ezt a problémát megoldja.
2012. aug. 16. 07:43
 15/16 anonim ***** válasza:

getline-nal olvasol, azaz nem karakterenként

a formátum megoldása pedig valóban a te dolgod, ha mondjuk spacek választják el a számokat, akkor nem túl nehéz feldarabolni, és atoi-val integerré alakítani.

nekem továbbra is az a meglátásom, hogy azt se tudod pontosan megfogalmazni, hogy mi a probléma. először talán írd meg nem optimálisan, tedd föl, és utána beszélünk róla, hogy mit kéne optimalizálni. egyébként is igy szokták. üdv

2012. aug. 16. 11:18
Hasznos számodra ez a válasz?
 16/16 anonim ***** válasza:

Ha annyira irózol az újraolvasástól: mi lenne, ha karakterenként olvasnál, és írnál egy állapotautomatát a feldolgozásra? Ez meg fogja nyúzni a vinyót, hiszen karakterenként fog HDD-hez fordulni, és gépi ciklusok számát tekintve sem a leggyorsabb, viszont teljesíti az olvasás közbeni feldolgozás kritériumot, ha arra akarsz optimalizálni.


Szerintem a getline(), majd stringfeldolgozás a legjobb, mivel egyszer olvas a file ból (1 HDD művelet), kiszedi az entert, és utána karakterenkénti feldolgozást a memóriában csinálsz. Bármilyen más esetben meg kell lépned a getline-t, hiszen a komment sor után is kell entert keresni, hogy a file pointert a következő sorra állítsd.


Karakterenkénti feldolgozás helyett szavanként is megpróbálhatsz feldolgozni - gondolom programnyelvet szeretnél írni - akkor viszont kell egy függvény, ami szétszedi a puffert egy tömbbé, amit utána elemenként feldolgozol. Így 3x olvastál (1x HDD-ről, 2x RAMból), de kevesebb gépi ciklusból megvagy, mintha karakterenként dolgoznál fel.


Ha az adatok pl. egy leltár részei (vagy más, adatbázisszerű, ismétlődő típusú adatokból áll), és elvárható a pontos adatbevitel, akkor tudnám ajánlani a getline után az sscanf-et, mivel akkor már adattípusra pontosan ismered a sor tartalmát, és beolvasás közben feldolgozhatod, nem kell foglalkozni még a konverziókkal sem.

2012. aug. 17. 02:56
Hasznos számodra ez a válasz?
1 2

Kapcsolódó kérdések:




Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!