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

čtení souboru do řetězce – C / C++ – Fórum – Programujte.comčtení souboru do řetězce – C / C++ – Fórum – Programujte.com

 

neimenuje0
Návštěvník
11. 4. 2007   #1
-
0
-

Mám takový problém, potřebuju postupně přečíst soubor do typu string, ale zůstává mi tam bordel z předchozího čtení. Tu je část zdrojáku:



....
#define BUFSIZE 1024
....
FILE *bufFH;
int size = totalSize;
string clientCMD;
char returnData[BUFSIZE];
....
while (!feof(bufFH) and totalSize < 2000000)
{
size = ftell(bufFH);
fread(returnData, BUFSIZE - 1, 1, bufFH);
totalSize = ftell(bufFH);
returnData[totalSize - size] = '\0';
clientCMD += returnData;
}
....

Když to čte soubor postupně a cykluje, tak by se to dalo popsatasi takhle:

1. načtena 1. část 1023 bytu ze souboru
2. načtena 2. část 500 bytu ze soboru + bordel z prvniho čtení

asi tam bude chyba s tím nulovým bajtem, nevím si s tím rady.
Děkuji za případnou radu

Nahlásit jako SPAM
IP: ...–
zacatecnik0
Super člen
11. 4. 2007   #2
-
0
-

mno tak hodil sem na to jen vetrinu okem a vytkl bych:
pretezovani operator + jde tusim pouzit na string + string ale jistej si samozrejme nejsem, jak jsem psal o post vedle C+ neumim.

dale:

while (!feof(bufFH) and totalSize < 2000000)
co ma byt to and ? -> && nebo || ?

a proc neotvirate soubory po c++, kdyz uz C tak to pojemnujte fw nebo fr, to je na prvni pohled vedet wo co gou

Nahlásit jako SPAM
IP: ...–
Můj blog http://www.zacatecnik.wu.cz[br]Překládám anglickou knihu o wxWidgets http://wxwidgets.hustej.net
Jura
~ Anonymní uživatel
637 příspěvků
11. 4. 2007   #3
-
0
-

To neimenuje:
Ten soubor oteviras v binarnim nebo textovem rezimu?
Jinak co se tyce toho scitani, tak to je samozrejme v poradku(nejspise se pouzije volani basic_string& operator+=(const charT* s), pokud ho ma trida implementovan, jinak by se patrne vytvori docasny objekt).

Nahlásit jako SPAM
IP: ...–
neimenuje0
Návštěvník
11. 4. 2007   #4
-
0
-

No ten program má 2 volby, v textovém i binárním režimu

Nahlásit jako SPAM
IP: ...–
neimenuje0
Návštěvník
11. 4. 2007   #5
-
0
-

Neexistuje nějaký nepříliš pracný způsob aby se to přímo načetlo do typu string a nemusel bych tam dávat char[] jako prostředníka?

Nahlásit jako SPAM
IP: ...–
zacatecnik0
Super člen
11. 4. 2007   #6
-
0
-

vsadim se ze to bude:
c - char
c++ - string
takze kdyz se chcete vyhnout char tak pouzijte nacitani souboru v c++

Nahlásit jako SPAM
IP: ...–
Můj blog http://www.zacatecnik.wu.cz[br]Překládám anglickou knihu o wxWidgets http://wxwidgets.hustej.net
sn3d0
Věrný člen
12. 4. 2007   #7
-
0
-

Ak pouzijes ifstream tak nepotrebujes char uprostred.



ifstream f;
string s;

f.open("file.txt");
f >> s;
f.close();


len treba si uvedomit ze to nacitava text po riadkoch.Takze ak chces dostat cely obsah do jedneho stringu tak radsej chod na to nejak takto:


ifstream f;
string s;
string complete;
stringstream ss;

f.open("file.txt");
ss.clear();
while (!f.eof()) {
f >> s;
ss << s;
}

complete = ss.str();

Nahlásit jako SPAM
IP: ...–
shutdown -h now
neimenuje0
Návštěvník
12. 4. 2007   #8
-
0
-

Jenže je jeden problém, nezastavuje se to u řádků ale u všech bílých znaků, takže nevím jestli tam byla mezera, tabulátor nebo newline a to co poskládám je bez toho. Nenašel sem u ifstreamu žádnou praktickou členskou fci, co by přečetla celý soubor.

Nahlásit jako SPAM
IP: ...–
neimenuje0
Návštěvník
12. 4. 2007   #9
-
0
-

Asi jsem si pomoh takhle:



string readFileAsString(const char filename[])
{
ifstream bufFileStream(filename);
string bufstring;
while (!bufFileStream.eof())
{
bufstring += bufFileStream.get();
}
return(bufstring);
}

ale nevím jestli to zbytečně nezatěžuje systém číst po jednom znaku, ale asi mám zbytečné obavy.

Nahlásit jako SPAM
IP: ...–
Mirek Braho0
Stálý člen
20. 4. 2007   #10
-
0
-

Jde nejak do pole vypsat nazvy souboru v adresari? Vsude je jen prace se soubory (FILE) ale adresare nikde :( Hledam to uz hodinu, MSDN, cppreference ani na googlu to nikde nemuzu najit. Typickej priklad zacatecnika programatora, ... kdyz proste potrebuju takovou vec, jako výpis adresare, jak to mam najit? Podle ceho? Mam dat vyhledat directory, nebo neco jinyho kdyz neznam nazev funkce ktera by to delala? Zjistil sem treba, ze k tomu je potreba knihovna io.h (nebo dir.h) ale kdyz dam vyhledat io.h tak to nic nenajde. Logicky by bylo snad to, kdyby mi to vyhledalo funkce obsazeny v ty knihovne a jejich popis ne? Nebo to fakt vzdycky musim hledat hodiny a hodiny jak blb na internetu kvuli takovyhle blbosti jako prace s adresari? :/ ach jo :(

Aby jste byli v obraze, jde mi o to, ze program bude editovat textovej soubor, kterej bude v tom samym adresari. Ale dopredu nevim, jak se ten soubor bude jmenovat, tak nemuzu dat

fopen("nejaky_jmeno.txt", r)
ze jo. Nebo to jde udelat i jinak se stejnou funkci?

Nahlásit jako SPAM
IP: ...–
sn3d0
Věrný člen
20. 4. 2007   #11
-
0
-

Je to len vynatok z jedneho mojho kodu..



DIR* dir = NULL;
struct dirent* dir_entry = NULL;
vector<string> mFilesList;

//open source dir
dir = opendir(mDirSource.c_str());
if (!dir) {
return -1;
}

//go throught all files in dir
while ( (dir_entry = readdir(dir)) != NULL ) {
string file_name = dir_entry->d_name;
struct stat file_stat;
string source_path = mDirSource + "/" + file_name;
int res;

res = stat(source_path.c_str(), &file_stat);
if (file_stat.st_mode & S_IFDIR == S_IFDIR) {
//jedna sa o subdir
continue;
}

mFilesList.push_back(file_name);
}

closedir();

Nahlásit jako SPAM
IP: ...–
shutdown -h now
Mirek Braho0
Stálý člen
20. 4. 2007   #12
-
0
-

SN3DE ty jsi snad spoluautor C++ že znáš na všechno odpověď ? :) Co se musí includovat aby to znalo to DIR a opendir ? To je v tý io.h knihovně?
Jinak díkes

Jinak ještě dotaz ... mam v souboru text ve tvaru {254}{435}

Jakou funkcí, nebo jakym způsobem převedu ty 2 čísla z charu na integer (protože to čtu ze souboru pomocí get() tak to čte po znaku) abych je moh zvětšit a pak je tam zase zapsat zpátky? A jak z toho tvaru dostat jen ty čísla. :/

Nahlásit jako SPAM
IP: ...–
sn3d0
Věrný člen
20. 4. 2007   #13
-
0
-

includni si dirent.h.. Je to POSIXovske takze by to malo slapat ja na Win32.. Btw zdaleka neviem vsetko.. Co sa tyka toho "{254}{435}" tak myslim ze scanf ti pomoze:



FILE* f;
int x,y;
char buf[1024];

f = fopen("subtitles.txt", "r");
if (!f) {
printf("ERROR\n");
system("PAUSE");
return 0;
}

while(!feof(f))
{
fscanf(f, "{%d}{%d}%s\n", &x, &y, &buf);
}
fclose(f);

Nahlásit jako SPAM
IP: ...–
shutdown -h now
Jura
~ Anonymní uživatel
637 příspěvků
20. 4. 2007   #14
-
0
-

A ja jen dolpnim. Pokud soubor muze obsahovat chyby, nebo ten format neni presne dany (mezi "{256}{456}" se muzou vyskytovat mezery, znaky), tak potom je vhodne pouzit nejaky stavovy (konecny) automat.

Nahlásit jako SPAM
IP: ...–
sn3d0
Věrný člen
20. 4. 2007   #15
-
0
-
Nahlásit jako SPAM
IP: ...–
shutdown -h now
Mirek Braho0
Stálý člen
20. 4. 2007   #16
-
0
-

Tak jsem zatim stvořil tohle:

#include <iostream>

#include <fstream>

using namespace std;

int main()
{
char *ch = new char;
char *j = new char;

ifstream soubor;
soubor.open("titulkysub.sub");

if (!soubor) { cout << "Soubor nenalezen!" ; }

while((*ch=='1') or (*ch=='{')) {
soubor.get(*ch);
}

soubor.get(*ch);
if (*ch=='{') //sub
{

for (int x=1; x<=100; x++) {
do {
soubor.get(*j);
if (*j=='{')

soubor.get(*j);
if (*j=='}') break;
if (isdigit (*j))
cout << *j;
delete j;

} while(1);
cout <<endl;
}

}
else if(*ch=='1') //srt
{
}
delete j;
delete ch;
cin.get();
return 0;
}


Funguje to, ale nevytahuje to čistý čísla. První 2 jsou v pohodě, pak to tam hází nějaký blbosti. Vypíše mi to tohle (není to celý) -
163
230
°232
293
xx441
x508
650
°1066

Proč to tam háže ty blbosti? Napadlo mě že by v paměti zůstával nějakej bordel, tak sem nastavil radši po každym kroku vymazání paměti na adrese kam ukazujou ty pointery. Ale nepomohlo :/

Nahlásit jako SPAM
IP: ...–
Jura
~ Anonymní uživatel
637 příspěvků
20. 4. 2007   #17
-
0
-

#include <cstdlib>

#include <iostream>
#include <fstream>

using namespace std;


int main(int argc, char *argv[])
{
ifstream fin("number.txt");
if(!fin.is_open()) return -1;
while(fin.good())
{ int c = fin.get();
if(c == '{')
{ int num = 0;
for(;fin.good(); c = fin.get())
{ if(isdigit(c)) num = num*10+c-'0';
if(c == '}') break;
}
cout << num << endl; // s tim cislem si delej co chces
}
}
fin.close();
system("PAUSE");
return EXIT_SUCCESS;
}

Nahlásit jako SPAM
IP: ...–
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, 30 hostů

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ý