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ť
Fórum › C / C++
Ifstream
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.
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.
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
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...
....
#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
#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;
}
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?
Zjistit počet nových příspěvků
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa































Uživatelé prohlížející si toto vlákno
Podobná vlákna
Ifstream.get -> integer — založil Debugger
Naplneni buffru z ifstream — založil .
Timeout pro ifstream? — založil yaqwsx
Ifstream čte i po EOF ?! — založil Eatel
Ifstream - otevření zabaleného souboru — založil Kenvelo
Moderátoři diskuze
TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Newbie

Nahlásit jako SPAM
IP: 78.98.185.–
Stálý člen

