Potrebuji s existujicim souborem pracovat jako s polem charu stejne jako bych soubor otevrel v hex editoru. Jednoduse se chci odkazat cislem na urcitou cast souboru (jednoho bajtu). Chci cist a prepisovat existujici soubor. Jsem celkem zacatecnik, takze si moc nevim rady. Dekuji za kazdou odpoved
Fórum › C / C++
Cteni souboru
Dost záleží, co s tím souborem pak chceš dělat. Následujícím kódem získáš postupně ze souboru všechny znaky. Já je jen vypisuji, ale ty si je můžeš uložit do pole, std::vectoru, std::stringu nebo čehokoliv, co ti bude pro tvé použití vyhovovat nejlépe.
// bude obsahovat právě načtený znak
char znak;
// Otevře soubor
std::fstream soubor( "jmenosoubor.txt", std::fstream::in );
//.. test správného otevření vynechán
// Dokud je co číst
while ( soubor >> std::noskipws >> znak) {
// Vypíše jeden znak
std::cout << znak;
}
Pokud bys četl pouze ASCII soubor, kde každý znak je reprezentován skutečně jednou hodnotou, mohlo by fungovat něco takového.
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
std::string text;
std::stringstream stream;
int main() {
// Otevřeme soubor
std::ifstream file( "test.txt", std::fstream::out );
// Pokud se soubor podařilo otevřít
if( file.is_open() ) {
// Přejdeme až na konec souboru
file.seekg( 0, std::ios::end );
// Získáme délku souboru
int length = file.tellg();
// Opět přejdeme na začátek
file.seekg(0, std::ios::beg);
// Zeptáme se uživatele, kam chce přesunout "kurzor"
std::cout << "Pozice kurzoru: (0-" << length << "):";
int seek_position;
std::cin >> seek_position;
// Pokud je pozice v rozsahu 0 až délka souboru
if( seek_position >= 0 && seek_position <= length ) {
// Přesuneme se na zadanou pozici
file.seekg( seek_position, std::ios::beg );
// Načteme text
stream << file.rdbuf();
text = stream.str();
// Vypíšeme text
std::cout << text << std::endl;
// Pokud uživatel zadal neplatnou pozici
} else {
std::cout << "Spatna pozice!" << std::endl;
}
// Pokud se soubor nezdařilo otevřít
} else {
std::cout << "Soubor se nezdarilo otevrit." << std::endl;
}
return 0;
}
Obsah souboru:
Test pohybovani kurzorem v souboru.
Zkusime preskocit na tento radek.
I tento radek bude zobrazen!
Výstup:
# Pozice kurzoru: (0-98): 36
> Zkusime preskocit na tento radek.
> I tento radek bude zobrazen!
Problém je, že znaky jako ěščřžýáíé jsou uloženy jako základní znak a háček. Tím pádem získáš dvojnásobnou délku, která ve skutečnosti neodpovídá skutečné délce. Tady asi bude jednodušší celý soubor (nebo jeho část) načíst do paměti a pracovat s textem až zde.
Problém je, že znaky jako ěščřžýáíé jsou uloženy jako základní znak a háček.
I ASCII umožňuje národní znaky, nacházejí se v její horní polovině, viz http://www.tyl.cz/Pocitace/Internet/Tabulka-ASCII-znaku.html . Nastal však problém, že různé jazyky vyžadují různé "své" znaky. Těch je ale tolik, že by se do jednoho byte nevešly. Jak tedy zobrazit vedle sebe češtinu, slovenštinu, němčinu, maďarštinu.....? Zvolit kódování, které umožní rozlišit více znaků než je u ASCII (max 256 znaků) a tím vyplývá nutnost použít více bytů pro uložení jednoho znaku.
hu
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
čtení ze souboru — založil VitPet
čtení ze souboru — založil Roman
čtení ze souboru — založil Jakub Vojáček
čtení ze souboru — založil witsarah
Cteni souboru. — založil ewzen
Moderátoři diskuze