Anonymní profil Jerry – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Anonymní profil Jerry – Programujte.comAnonymní profil Jerry – Programujte.com

 

Příspěvky odeslané z IP adresy 2a00:1028:83be:235a:7cb2:...–

Jerry
C / C++ › Přeskočení na druhý řádek v…
2. 5. 2017   #215793

#6 ORION206
hodnota countValueExists  je proměnná, kterou jsem vytvořil a pojmenoval sám podle mojí okamžité nálady v daný moment - mám se fajn měl sem rybí filé k obědu, kdybych měl prejt menovalo by se to cVExst. :)

ano možné to je ale smazání řádku z textového souboru tak, že řádek smažeš celý (fyzisky odstraníš všechny znaky daného řádku) není možné - soubor je zapsaný na disku sekvenčně.  Bohužel  jde udělat jen to, že soubor otevřeš a překopíruješ

všechny řádky do jiného souboru kromě prvního, ale to je ten samý algoritmus jako sem už psal výše. takže jak vidíš nijak si to nezjednodušíš a navíc zbytečně budeš vytvářet další soubor. Obávám se že to asi budeš muset napsat protože pan učitel to po tobě buch chtít .. což je problém ...

takže bych zachoval postup popsaný výše, který vede k bezchybnému a přehlednému cíli hned napoprvé a obzvláště pro začátečníka tedy:

1/ otevřeš soubor načteš první řádek a vyplníš proměnnou countValueExists a zavřeš soubor.

2/ Otevřeš soubor a podle hodnoty countValueExists načteš první řádek a buď ho vynecháš prázdným příkazem std::getline(ifs, line);  nebo pokračuješ na cyklus while ve kterém do Listu načteš jednotlivé řádky

3/ Jedním cyklem for - uvnitř cyklu rozparsuješ každý řádek textu do struktury kterou ukládáš do druhého Listu.

je to efektivní, rychlé, a snadno čitelné. to cos napsal ty na začátku nebude nikdy fungovat...

začal bych tím kouskem kodu pro vyplnění proměnné bool countValueExists to je cca na 8 řádku.

a pak bych dal vědět jak to dopadlo :)

Jerry
C / C++ › Přeskočení na druhý řádek v…
2. 5. 2017   #215791

#4 Jerry
errata:

řádek

"takže potřebuješ 2 cykly for:"

má být správně

"takže potřebuješ cyklus for:"

Jerry
C / C++ › Přeskočení na druhý řádek v…
2. 5. 2017   #215790

#3 ORION206
aha no ale to je zase uplně jiné zadání než to co si popsal v úvodu

protože pokud je na prvním řádku souboru číslo jen "občas" - což je podle mě blbost

v zadání - mělo by tam být vždy, tak s ohledem na složitost kodu a výslednou přehlednost bych to udělal tak,

že bych otevřel soubor a načetl první řádek (který také musí mít na konci CR+LF) a rozparsoval ho. protože načítáš string mužeš převést string na číslo a pokud vše dopadne dobře znamená to že na prvním řádku je počet všech řádků v souboru - resp. jediné celočíselné číslo. Pokud převod skončí chybou tak tam je souřadnice. Převodní funkce je tady.

http://www.zezula.net/cz/prog/string_na_int.html

to by byla první část programu a výsledkem je hodnota např. bool countValueExists

která muže být true nebo false podle toho jestli počet řádků existuje nebo ne. Na konci této první části soubor uzavřeš příkazem close.

pak bude druhá část, a vstupní hodnotou do této části bude countValueExists. otevřeš soubor a na dalším řádku napíšeš

if ( countValueExists == true ) {  // na prvnim radku je uveden pocet radku v souboru

   std::getline(ifs, line);  // nactes de-fakto nepotrebny prvni radek
}// if

while ( eof - podminka konce souboru ... ) { // nebo přímo řádek načteš

      nejake_pole[xx] = std::getline(ifs, line);

}// while

... close file

nejake_pole[xx]  značí strukturu kam načtený řádek ukládáš muže to být např pole nebo list z knihovny 

http://www.cplusplus.com/reference/list/

já bych si vybral List a vkládal bych ukazatel na sting který obsahuje celý řádek tedy:

x y z odrazivost r g b

takže ten řádek

nejake_pole[xx] = std::getline(ifs, line);

pak musíš nahradit příkazy

String* item = new String; a podobně protože List očekává ukazatel

tady to je napsaný s příkladem

http://stackoverflow.com/questions/3726586/easily-initialise-an-stdlist-of-stdstrings

mužeš ale použít aj vector je to fuk

no takže nyní máš načtené řádky v paměti a víš kolik jich je a teď je rozparsuješ

takže potřebuješ 2 cykly for:

for ( i = od řádku 0 do max-1) { // cyklus projde vsechny nalezene radky

    line = List[i];

    tady vložíš kod pro nalezení pozice první mezery a extrahuješ text až po první mezeru

    atd... až k poslednímu místu

    tady je příklad

    http://www.cplusplus.com/…string/find/

   až najdeš první mezeru dáš

    line = line od pozice první mezery + 1 do konce

   a to samý pro číslo na druhý pozici, prostě pokaždé si odřízneš kousek z i-tého řádku odzačátku

   a ta odříznutá část je řetězec a ten převedeš funkcí  atoi a pak si ho někam schováš

    http://stackoverflow.com/…ing-to-int-c

    Moje_Struktura item = new Moje_Struktura();

    item->x = první extrahované číslo

    .....atd

    item->b = posledni extrahovane cislo

    List muj_List.PushBack(item)

}// for

ideální pro schování  x y z odrazivost r g b  je struktura, pro kterou alokuješ paměť příkazem NEW

v každém cyklu for ( i = od řádku 0 do max-1)  což je logické

pro uložení množiny struktur zvolíš List - ale mužeš i array nebo vector, ale list je asi nejlepší...

struct Moje_Struktura {

  double x;

  double y;

   ....

   double b;

}

no a to je všecho .. je to zajímavý zadání ...

Jerry
C / C++ › Přeskočení na druhý řádek v…
2. 5. 2017   #215785

No každej řádek tvého textového souboru by měl končit znaky CR+LF nebo 0x0A + 0x0D

pro platformu DOS/Windows.

tady je stejná otázka jako dáváš ty a k ni je odpověď:

http://www.cplusplus.com/forum/beginner/11304/

a tady je popis jak pracovat s CRLF

http://stackoverflow.com/questions/6089231/getting-std-ifstream-to-handle-lf-cr-and-crlf

a další:

http://stackoverflow.com/questions/13035674/how-to-read-line-by-line-or-a-whole-text-file-at-once

http://stackoverflow.com/questions/19123334/how-to-use-stdgetline-to-read-a-text-file-into-an-array-of-strings-in-c

uplně nechápu zdroják co si to tam napsal, ale pokud máš zadanej TXT soubor a v něm

čísla a jsou oddělená mezerou a jejich počet je variabilní (a tecy i nulový) a každý řádek je zakončen CRLF pak načteš řádek a pokud není prázdný rozparsuješ ho podle mezer. pokud je prázdný jdeš na další,

to že v řádku je méně čísel než např. 10 poznáš až při parsování.

pokud by si netrval na zadání TXT vstupního souboru tak by bylo lepší mít vstupní soubor v binárním tvaru. výrazně by to zrychlilo čtení a zpracování. a proč tu ulohu vlastně neděláš v C# .NET ???

 

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý