/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Problem med fileparsing
Fra : Christian Kristoffer~


Dato : 08-06-03 13:13

Hej alle

Jeg er ved at lave en metode som skal kunne returnere en bestemt linje fra
en tekstfil.
Jeg er dog aldrig kommet længere end til at få den til at returnere det
første bogstav

Jeg har vedlagt den seneste udgave af min metode, som egentlig slet ikke
virker.

Er der nogen som hurtigt kan vise mig hvordan jeg laver en sådan metode?

Venlig hilsen

Christian

char Utils::getInfoLine(int linenumber, char filename[])
{
int counter=0;
char line[256];
char infoArray[countTextLines(filename)]; // en metode til at tælle
tekstlinjer på.

ifstream inputfile(filename, ios::in | ios::binary);

if(!inputfile)
{
// if it fails
}

inputfile.read((char *) &inputfile, sizeof inputfile);



/*
while (!inputfile.eof())
{
inputfile.getline(line, sizeof(line));
//line >> infoArray[counter];
counter++;
}
*/

inputfile.close();
return infoArray[linenumber];
}




 
 
Ivan Johansen (08-06-2003)
Kommentar
Fra : Ivan Johansen


Dato : 08-06-03 15:45

Christian Kristoffersen wrote:
> char Utils::getInfoLine(int linenumber, char filename[])
Det undrer mig hvorfor funktionen er medlem af en klasse når den
tilsyneladende ikke bruger noget i klassen. Da du ikke ændrer på
filename bør den være const.

> char line[256];
Brug std:string i stedet for char[]. Så undgår du en begrænsning på
størrelsen, som du for øvrigt ikke tjekker om bliver overholdt.

> ifstream inputfile(filename, ios::in | ios::binary);
Normalt bruges ios::binary kun til binære filer, hvor det ikke giver
mening at snakke om linieskift.

> inputfile.read((char *) &inputfile, sizeof inputfile);
Dette er MEGET MEGET dumt. Du overskriver objektet inputfile med filens
indhold. Det skal gå galt.

Her er mit forslag til hvordan funktionen kan se ud:

#include <fstream>
#include <string>
std::string getInfoLine(unsigned linenumber, const char filename[])
{
std::ifstream inputfile(filename);

if(!inputfile)
return std::string(); //Cannot open file

std::string Str;
for(unsigned Line = 1; Line <= linenumber; Line++)
if(!getline(inputfile, Str))
return std::string(); //Not enough lines

return Str;
}


Ivan Johansen


Mogens Hansen (08-06-2003)
Kommentar
Fra : Mogens Hansen


Dato : 08-06-03 15:50


"Christian Kristoffersen" <chrkrist@TTTTTTTTTTThome.chrkrist.dk> wrote

[8<8<8<]
> Jeg har vedlagt den seneste udgave af min metode, som egentlig slet ikke
> virker.

Kan den overhovedet oversætte ?

>
> Er der nogen som hurtigt kan vise mig hvordan jeg laver en sådan metode?

Hvilken kilde bruger du til at finde ud af hvordan man skal gøre det ?


> char Utils::getInfoLine(int linenumber, char filename[])
> {
> int counter=0;
> char line[256];

Hvad hvis linierne er længere end 256 ?

> char infoArray[countTextLines(filename)]; // en metode til at tælle
> tekstlinjer på.

Oversætter denne linie ?

>
> ifstream inputfile(filename, ios::in | ios::binary);
>
> if(!inputfile)
> {
> // if it fails
> }
>
> inputfile.read((char *) &inputfile, sizeof inputfile);

Du læser indholdet in det hukommelsesområde, som fil-objektet ligger på!
Skulle det ikke nærmere være:
inputfile.read(line, sizeof line);

Hvad var meningen med linien ?

cast er farligt - man risikerer at compileren gør hvad man beder den om,
uanset hvad den måtte mene.
Nu er fil-objektet formodentligt effektivt ødelagt.

[8<8<8<]
> //line >> infoArray[counter];

Hvad

[8<8<8<]
> inputfile.close();

Overflødig.
Filen bliver lukket, når fil-objektet bliver nedlagt (når det går ud af
scope).

> return infoArray[linenumber];

Hvad er det du returnerer her ?
Det er ihverfald næppe en linie.


Prøv at bruge klassen "std::string" i stedet for char array.
Noget i retningen af
<C++ kode>
#include <string>
#include <fstream>

std::string foo(const char* filename)
{
std::ifstream in(filename);

if(!in) {
return "unable to open file";
}

std::string line;
while(std::getline(in, line)) {
if(line.length() == 4) { // some criteria
return line;
}
}

return "unable to find line";
}

int main(int argc, char* argv[])
{
for(int argi = 1; argi < argc; ++argi) {
foo(argv[argi]);
}
}
</C++ kode>


Venlig hilsen

Mogens Hansen



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408924
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste