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

Cteni souboru – C / C++ – Fórum – Programujte.comCteni souboru – C / C++ – Fórum – Programujte.com

 

marek321
~ Anonymní uživatel
13 příspěvků
19. 3. 2015   #1
-
0
-

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   

Nahlásit jako SPAM
IP: 2a00:1028:9193:2d5a:c048:...–
Lorin0
Návštěvník
19. 3. 2015   #2
-
0
-

 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; 
}
Nahlásit jako SPAM
IP: 89.190.72.–
marek321
~ Anonymní uživatel
13 příspěvků
19. 3. 2015   #3
-
0
-

Dekuji ! rozhodne pomohlo. A kdyz chci ukazatel premistit treba na 50. znak ? nekde jsem to uz videl ale nemuzu najit kde...

Nahlásit jako SPAM
IP: 2a00:1028:9193:2d5a:c048:...–
Lorin0
Návštěvník
20. 3. 2015   #4
-
0
-

 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.

Nahlásit jako SPAM
IP: 89.190.72.–
20. 3. 2015   #5
-
0
-

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

Nahlásit jako SPAM
IP: 195.178.67.–
marek321
~ Anonymní uživatel
13 příspěvků
22. 3. 2015   #6
-
0
-

Nejde o text ale o barvicky z bmp souboru. Kazdopadne dekuju vse funguje jak ma   

Nahlásit jako SPAM
IP: 2a00:1028:9193:2d5a:2dac:...–
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, 101 hostů

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

 

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