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?
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