Ifstream – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Ifstream – C / C++ – Fórum – Programujte.comIfstream – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
jurike0
Newbie
20. 3. 2008   #1
-
0
-

ahojte potrebujem helfa
chcem aby som nastavil( ifstream) tak aby vedel citat s textaču dajme tomu piatky riadok a štvrté slovo z neho kto mi vie pomôcť

Nahlásit jako SPAM
IP: 78.98.185.–
Reklama
Reklama
AdamHlavatovic0
Stálý člen
20. 3. 2008   #2
-
0
-

Jedným zo spôsobov je v súbore dopredu zmapovať všetky výskyty znaku nového riadku a potom, pri volaní metódy skočiť na daný index požadovaného riadku. Podobným spôsobom si môžte zmapovať všetky slová v danom riadku.

Nahlásit jako SPAM
IP: 217.73.16.–
jurike0
Newbie
20. 3. 2008   #3
-
0
-

To AdamHlavatovic :
Vlastne netuším čo tým myslíš a
lenže ja mam ten problém že netuším koľko bude mat riadkov.

Nahlásit jako SPAM
IP: 78.98.185.–
AdamHlavatovic0
Stálý člen
20. 3. 2008   #4
-
0
-

a) Musiš prejsť každým znakom v súbore a ak nájdeš znak nového riadku, zapíšeš si jeho pozíciu. Potom, ak budeš chcieť skočiť do štvrtého riadku tak si v tabuľke nájdeš adresu tretieho výskytu znaku nového riadku, k tejto pozícii pripočítaš 1 a na danú pozíciu skočíš.

b) Alebo nič dopredu mapovať nebudeš a ak budeš chcieť skočiť do štvrtého riadku, budeš prechádzať súbor dokým nenarazíš na tretí výskyt znaku nového riadku.

Nahlásit jako SPAM
IP: 217.73.16.–
jurike0
Newbie
21. 3. 2008   #5
-
0
-

Vyjadrím sa asi lepšie : mam textový súbor v ktorom je na prvých piatich riadkoch popis tvorcu, dátum, čas a pod.(tieto údaje nechcem čítať)
a pod tým sa nachádzajú súradnice bodov ktoré chcem prečítať v postupnosti: číslo bodu/medzera/x-súradnica/medzera/y-súradnica

Nahlásit jako SPAM
IP: 84.245.64.–
Jura_0
Stálý člen
21. 3. 2008   #6
-
0
-

To jurike :

Zdravím,

pokud to má být jen na jednorázové použití a nepřepokládáš, že ten soubor bude měnit nějak svou strukturu, tak pak je asi nejjednoušší použít starý dobrý FILE a funkci fscanf. Nebo, když už to tedy chceš mermomocí pomocí proudů, tak pak bych zkusil:



ifstream fin("jmeno");
...
std::string strLine;
// preskoc radky ktere nechces
for(int i = 0; i < pocet_radku; ++i)
if( !fin || !getline(fin, strLine) )
// chyba - nahlas, vyhod vyjimku, vrat nejaky chybovy kod nebo zaloguj, nebo uplne neco jineho
....

// precti radek
if( !fin || !getline(fin, strLine) ) chyba, atd...

std::istringstream istr(strLine);

int iCisloBodu;
double dCoordX, dCoordY;
istr >> iCisloBodu >> dCoordX >> dCoordY;
if( !istr ) chyba...
....

Nahlásit jako SPAM
IP: 85.207.192.–
jurike0
Newbie
21. 3. 2008   #7
-
0
-

istr >> iCisloBodu >> dCoordX >> dCoordY;

na tomto mi hádže chybu a neviem čo s tým

Nahlásit jako SPAM
IP: 78.98.168.–
Jura_0
Stálý člen
21. 3. 2008   #8
-
0
-

To je sice pěkné, ale bez popisu můžu jen hádat. Includoval jsi soubor sstream?



#include <sstream>

Nahlásit jako SPAM
IP: 85.207.192.–
jurike0
Newbie
21. 3. 2008   #9
-
0
-

samozrejme kebyže nie už skorej mi to hádže chyby

Nahlásit jako SPAM
IP: 78.98.168.–
jurike0
Newbie
21. 3. 2008   #10
-
0
-

nemohol by si sem napísať všetko totálne s tým neviem pohnúť mi asi zamrzla bunka v hlave

Nahlásit jako SPAM
IP: 78.98.168.–
Jura_0
Stálý člen
21. 3. 2008   #11
-
0
-



#include <sstream>
#include <iostream>
#include <cassert>
#include <fstream>

int main()
{
static const int SKIP = 5;
std::ifstream fin("test.txt");

if( !fin ) {
std::cerr << "Nepovedlos se otevrit soubor" << std::endl;
return 1;
}

std::string line;
for( int i = 0; i < SKIP; ++i )
if( !fin || !std::getline(fin, line) )
{ std::cerr << "Nepovedlos se zpracovat soubor" << std::endl;
fin.close();
return 1;
}


if( !fin || !std::getline(fin, line) )
{
std::cerr << "Nepovedlos se zpracovat soubor" << std::endl;
fin.close();
return 1;
}

int iPoradi;
double dCoordX, dCoordY;

std::istringstream istr(line);
istr >> iPoradi >> dCoordX >> dCoordY;

std::cout.precision(10);
std::cout << iPoradi << "\n" << dCoordX << "\n" << dCoordY << std::endl;
assert( istr );

fin.close();
return 0;
}


A test.txt:


prvni
druhy
treti
ctvrty
paty
1 12.85 1235.12365449

Nahlásit jako SPAM
IP: 85.207.192.–
jurike0
Newbie
21. 3. 2008   #12
-
0
-

Ďakujem ale po pripojení môjho súboru mi hodí wokno chybu po spustení!

[url=http://img523.imageshack.us/my.php?image=obrazoklp4.jpg][img=http://img523.imageshack.us/img523/6870/obrazoklp4.th.jpg][/url]

Nahlásit jako SPAM
IP: 78.98.168.–
Jura_0
Stálý člen
21. 3. 2008   #13
-
0
-

heh, vyhoď ten assert.

Nahlásit jako SPAM
IP: 85.207.192.–
jurike0
Newbie
21. 3. 2008   #14
-
0
-

ano takto to funguje ďakujem
čo robí ten assert??
a vlastne nepopíšeš mi tie funkcie aby som tomu aj pochopil, samozrejme ak budeš mať čas.
D

Nahlásit jako SPAM
IP: 78.98.168.–
Jura
~ Anonymní uživatel
634 příspěvků
21. 3. 2008   #15
-
0
-



#include <sstream> // kvuli istringstream
#include <iostream>
#include <cassert>
#include <fstream>

int main()
{
static const int SKIP = 5; // pocet radek, ktere se maji preskocit
std::ifstream fin("test.txt");

if( !fin ) {
std::cerr << "Nepovedlos se otevrit soubor" << std::endl;
return 1;
}

std::string line; // pomocna promenna pro nacteni radku
for( int i = 0; i < SKIP; ++i )
if( !fin || !std::getline(fin, line) )// cte radek po radku, dokud je i < SKIP nebo pokud se vykytne chyba, nebo konec souboru
{ std::cerr << "Nepovedlos se zpracovat soubor" << std::endl; // napise o tom hlasku uzivateli
fin.close();
return 1;
}


if( !fin || !std::getline(fin, line) ) // viz. vyse pokud se nepovede nacist radek
{
std::cerr << "Nepovedlos se zpracovat soubor" << std::endl;
fin.close();
return 1;
}

int iPoradi;
double dCoordX, dCoordY;

std::istringstream istr(line); // istringstream trida pro extrahovani dat ze stringu
istr >> iPoradi >> dCoordX >> dCoordY; // tak jako klasicky cin - cte po prvni bily znak

std::cout.precision(10); // nastavi pocet zobrazovanych cislic pred a za desetinnou carkou
std::cout << iPoradi << "\n" << dCoordX << "\n" << dCoordY << std::endl;
//assert( istr ); je funkce, ktera testuje jestli je zadany vyraz true, pokud je false tak to vybafne a ukonci program - hodi se pouze pro ladici ucely, v Release verzi se asserty automaticky vypousteji

fin.close();
return 0;
}

Nahlásit jako SPAM
IP: 85.207.192.–
jurike0
Newbie
21. 3. 2008   #16
-
0
-

if( !fin || !std::getline(fin, line) )//  cte radek  po radku, dokud je i < SKIP nebo pokud se vykytne chyba, nebo konec souboru


{ std::cerr << "Nepovedlos se zpracovat soubor" << std::endl; // napise o tom hlasku uzivateli

fin.close();

return 1;

}





if( !fin || !std::getline(fin, line) ) // viz. vyse pokud se nepovede nacist radek

{

std::cerr << "Nepovedlos se zpracovat soubor" << std::endl;

fin.close();

return 1;

}


dobre a teda mám daľšie otázky načo je tam toto dva krát, teda keď jedu časť zmažem nepíše mi to správne čísla a dalo by sa to spraviť aj tak že by mi od toho SKIP plus jeden riadok čítal všetky daľšie po ňom nasledujúce riadky?

Nahlásit jako SPAM
IP: 78.98.168.–
Jura
~ Anonymní uživatel
634 příspěvků
21. 3. 2008   #17
-
0
-

Dalo.

Nahlásit jako SPAM
IP: 85.207.192.–
jurike0
Newbie
21. 3. 2008   #18
-
0
-

a ako? či už nemáš chuť

Nahlásit jako SPAM
IP: 78.98.168.–
Jura
~ Anonymní uživatel
634 příspěvků
22. 3. 2008   #19
-
0
-

Tohle:



for( int i = 0; i < SKIP; ++i )

nahraď tímto:


for( int i = 0; i <= SKIP; ++i )

A ten další if za cyklem umaž.

Nahlásit jako SPAM
IP: 85.207.192.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 129 hostů

Podobná vlákna

Ifstream.get -&gt; integer — založil Debugger

Ifstream čte i po EOF ?! — založil Eatel

Timeout pro ifstream? — založil yaqwsx

Moderátoři diskuze

 

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