/ 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
Problemer med at lave fileparse function i~
Fra : Christian Kristoffer~


Dato : 12-06-03 13:06

Hej Alle

Jeg har behov for lidt hjælp til at lave denne funktion færdig.

Funktionen skal returnere hvor mange gange en bestemt string, er
tilstede i den angivende fil. Som i kan se er jeg ikke helt færdig med
at lave den, og er ikke helt sikker på hvordan jeg skal komme videre.


På forhånd tak

Venlig hilsen

Christian



unsigned Utils::countNumberOfTimesTextlineIsPresent(const string
textline, const char filename[]) // counts number
of times a line is present
{
unsigned lines=countTextLines(filename);

string array[lines];
string textlineToArray;

ifstream inputfile(filename);
if (!inputfile)
cout << "File not found !!!" << endl;

for (unsigned i = 0 ; i <= lines ; i++)
{
getline(inputfile, textlineToArray);
array[i]=textlineToArray;
}

// her skal resten så være


}


 
 
Bertel Brander (12-06-2003)
Kommentar
Fra : Bertel Brander


Dato : 12-06-03 15:12

Christian Kristoffersen wrote:
> Hej Alle
>
> Jeg har behov for lidt hjælp til at lave denne funktion færdig.
>
> Funktionen skal returnere hvor mange gange en bestemt string, er
> tilstede i den angivende fil. Som i kan se er jeg ikke helt færdig med
> at lave den, og er ikke helt sikker på hvordan jeg skal komme videre.
>
>
> På forhånd tak
>
> Venlig hilsen
>
> Christian
>
>
>
> unsigned Utils::countNumberOfTimesTextlineIsPresent(const string
> textline, const char filename[]) // counts number
> of times a line is present
> {
> unsigned lines=countTextLines(filename);
>
> string array[lines];
> string textlineToArray;
>
> ifstream inputfile(filename);
> if (!inputfile)
> cout << "File not found !!!" << endl;
>
> for (unsigned i = 0 ; i <= lines ; i++)
> {
> getline(inputfile, textlineToArray);
> array[i]=textlineToArray;
> }
>
> // her skal resten så være
>
>
> }
>
"Resten" kunne være følgende:
unsigned int count = 0, pos, idx;
for (unsigned i = 0 ; i < lines ; i++)
{
for(pos = 0; (idx = array[i].find(textline, pos)) != -1; pos = idx + 1)
count++;
}
return count;

Hvorfor læser du hele filen ind i memory før du laver dette?

Jeg tror at linien:
"for (unsigned i = 0 ; i <= lines ; i++)"
skal rettes til
"for (unsigned i = 0 ; i < lines ; i++)"

Det er almindeligt brugt at skrive "unsigned int" helt ud, selv om det
er lovligt at nøjes med at skrive "unsigned", de fleste (jeg selv
inklusive) synes at det er kønnere.


/b


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


Dato : 12-06-03 15:26



"Christian Kristoffersen" <chrkrist@ccvvmmtt.ddkk> wrote

> Funktionen skal returnere hvor mange gange en bestemt string, er
> tilstede i den angivende fil. Som i kan se er jeg ikke helt færdig med
> at lave den, og er ikke helt sikker på hvordan jeg skal komme videre.

Det er nemmere end man måske skulle tro.
Brug funktionen std::count.

<C++ kode>
#include <string>
#include <fstream>
#include <iostream>
#include <iterator>
#include <cstdlib>

int main(int argc, char* argv[])
{
using namespace std;
if(argc != 3) {
cerr << "Unexpected number of arguments" << endl;
return EXIT_FAILURE;
}

ifstream in(argv[1]);
if(!in) {
cerr << "Unable to open file " << argv[1];
return EXIT_FAILURE;
}

const unsigned word_count = count(
istream_iterator<string, char>(in), istream_iterator<string, char>(),
string(argv[2]));
cout << "The word \"" << argv[2] << "\" is present " << word_count << "
times in the file \"" << argv[1] << "\"" << endl;
}
</C++ kode>

Venlig hilsen

Mogens Hansen



Michael Bülow Jensen (12-06-2003)
Kommentar
Fra : Michael Bülow Jensen


Dato : 12-06-03 15:33


"Christian Kristoffersen" <chrkrist@ccvvmmtt.ddkk> wrote in message
news:3EE86C9B.4070306@ccvvmmtt.ddkk...
> Hej Alle
>
> Jeg har behov for lidt hjælp til at lave denne funktion færdig.
>
> Funktionen skal returnere hvor mange gange en bestemt string, er
> tilstede i den angivende fil. Som i kan se er jeg ikke helt færdig med
> at lave den, og er ikke helt sikker på hvordan jeg skal komme videre.
>
>
> På forhånd tak
>
> Venlig hilsen
>
> Christian
>
>
>
> unsigned Utils::countNumberOfTimesTextlineIsPresent(const string
> textline, const char filename[]) // counts number
> of times a line is present
> {
> unsigned lines=countTextLines(filename);
>
> string array[lines];
> string textlineToArray;
>
> ifstream inputfile(filename);
> if (!inputfile)
> cout << "File not found !!!" << endl;
>
> for (unsigned i = 0 ; i <= lines ; i++)
> {
> getline(inputfile, textlineToArray);
> array[i]=textlineToArray;
> }
>
> // her skal resten så være
>
>
> }

Lidt ligesom B.B. spørger... Hvorfor indlæser du hele filen ind i
hukommelsen først?

Hvis det ikke er absolut nødvendigt, er der her en funktion som jeg vil mene
løser opgaven.

PS! Ikke den store haj til STL endnu, så hvis der er noget galt med den, vil
jeg gerne høre om det :)



#include <fstream>
#include <string>
#include <iostream>

unsigned long countTextInFile(std::string text, std::string filename)
{
unsigned long dwResult = 0;

std::ifstream input(filename.c_str());

if(input.is_open())
while(!input.eof())
{
std::string line;
std::getline(input, line);
if(line == text)
dwResult++;
}
else
std::cout << "File not found";

return dwResult;
}

int main()
{
std::cout << countTextInFile("Hej med dig", "C:\\Temporary\\hmd.txt") <<
std::endl;
}



- Michael



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


Dato : 15-06-03 07:02


"Michael Bülow Jensen" <mbulow_trygmed@pc.dk> wrote

[8<8<8<]
> if(input.is_open())
> while(!input.eof())
> {

Hvad gør denne løkke, hvis tilgangen til filen fejler af en anden grund end
at slutningen er nået ?
Det kunne f.eks. være at forbindelsen til det netværksdrev, hvor filen
ligger pludselig er forsvundet.

Er der nogen grund til ikke at bruge den idiomatiske form:
while(input) {
som håndterer alle fejl ?

Venlig hilsen

Mogens Hansen



Christian Kristoffer~ (12-06-2003)
Kommentar
Fra : Christian Kristoffer~


Dato : 12-06-03 23:01

Hej alle igen

Jeg har stadig problemer med at få nedstående til at virke.



unsigned int Utils::countNumberOfTimesTextlineIsPresent(const string
textline, const char filena
me[]) // counts number of times a line is present
{
unsigned int lines=countTextLines2(filename);

string array[lines];
string textlineToArray;

ifstream inputfile(filename);
if (!inputfile)
cout << "File not found !!!" << endl;


for (unsigned int i = 0 ; i <= lines ; i++)
{
getline(inputfile, textlineToArray);
textlineToArray << array[i]; // jeg kan ikke compile med denne linje.
}

unsigned int count = 0, pos, idx;

for (unsigned int i = 0 ; i < lines ; i++)
{
for(pos = 0; (idx = array[i].find(textline, pos)) != -1; pos =
idx + 1)
count++;
}
return count; // returnere altid 0


}



Christian Kristoffersen wrote:
> Hej Alle
>
> Jeg har behov for lidt hjælp til at lave denne funktion færdig.
>
> Funktionen skal returnere hvor mange gange en bestemt string, er
> tilstede i den angivende fil. Som i kan se er jeg ikke helt færdig med
> at lave den, og er ikke helt sikker på hvordan jeg skal komme videre.
>
>
> På forhånd tak
>
> Venlig hilsen
>
> Christian
>
>
>
> unsigned Utils::countNumberOfTimesTextlineIsPresent(const string
> textline, const char filename[]) // counts number
> of times a line is present
> {
> unsigned lines=countTextLines(filename);
>
> string array[lines];
> string textlineToArray;
>
> ifstream inputfile(filename);
> if (!inputfile)
> cout << "File not found !!!" << endl;
>
> for (unsigned i = 0 ; i <= lines ; i++)
> {
> getline(inputfile, textlineToArray);
> array[i]=textlineToArray;
> }
>
> // her skal resten så være
>
>
> }
>


Bertel Brander (12-06-2003)
Kommentar
Fra : Bertel Brander


Dato : 12-06-03 23:21

Christian Kristoffersen wrote:

> Hej alle igen
>
> Jeg har stadig problemer med at få nedstående til at virke.
>
>
>
> unsigned int Utils::countNumberOfTimesTextlineIsPresent(const string
> textline, const char filena
> me[]) // counts number of times a line is present
> {
> unsigned int lines=countTextLines2(filename);
Hvis countTextLines2() ikke kan åbne filen, hvad sker der så?
>
> string array[lines];
> string textlineToArray;
>
> ifstream inputfile(filename);
> if (!inputfile)
> cout << "File not found !!!" << endl;
Det ville være en god ide at returnere her, hvis filen ikke
kan åbnes, ellers kan der ske sære ting når du forsøger at
læse fra filen,
>
>
> for (unsigned int i = 0 ; i <= lines ; i++)
Denne linie skal vist være:
for (unsigned int i = 0 ; i < lines ; i++)
> {
> getline(inputfile, textlineToArray);
> textlineToArray << array[i]; // jeg kan ikke compile med denne linje.
> }
Denne linie skal være:

array[i]=textlineToArray;

som i den oprindelige kode.
>
> unsigned int count = 0, pos, idx;
>
> for (unsigned int i = 0 ; i < lines ; i++)
> {
> for(pos = 0; (idx = array[i].find(textline, pos)) != -1; pos = idx
> + 1)
> count++;
> }
> return count; // returnere altid 0
>
Hvordan ved du det når koden ikke kan compile?
Jeg tror at det vil virke når du har rettet ovenstående.
>
> }


/b


Christian Kristoffer~ (13-06-2003)
Kommentar
Fra : Christian Kristoffer~


Dato : 13-06-03 01:30

Hej Bertel

Mange tak for hjælpen, jeg er nu kommet et stykke videre

Venlig hilsen

Christian

Bertel Brander wrote:
> Christian Kristoffersen wrote:
>
>> Hej alle igen
>>
>> Jeg har stadig problemer med at få nedstående til at virke.
>>
>>
>>
>> unsigned int Utils::countNumberOfTimesTextlineIsPresent(const string
>> textline, const char filena
>> me[]) // counts number of times a line is present
>> {
>> unsigned int lines=countTextLines2(filename);
>
> Hvis countTextLines2() ikke kan åbne filen, hvad sker der så?
>
>>
>> string array[lines];
>> string textlineToArray;
>>
>> ifstream inputfile(filename);
>> if (!inputfile)
>> cout << "File not found !!!" << endl;
>
> Det ville være en god ide at returnere her, hvis filen ikke
> kan åbnes, ellers kan der ske sære ting når du forsøger at
> læse fra filen,
>
>>
>>
>> for (unsigned int i = 0 ; i <= lines ; i++)
>
> Denne linie skal vist være:
> for (unsigned int i = 0 ; i < lines ; i++)
>
>> {
>> getline(inputfile, textlineToArray);
>> textlineToArray << array[i]; // jeg kan ikke compile med denne
>> linje.
>> }
>
> Denne linie skal være:
>
> array[i]=textlineToArray;
>
> som i den oprindelige kode.
>
>>
>> unsigned int count = 0, pos, idx;
>>
>> for (unsigned int i = 0 ; i < lines ; i++)
>> {
>> for(pos = 0; (idx = array[i].find(textline, pos)) != -1; pos =
>> idx + 1)
>> count++;
>> }
>> return count; // returnere altid 0
>>
> Hvordan ved du det når koden ikke kan compile?
> Jeg tror at det vil virke når du har rettet ovenstående.
>
>>
>> }
>
>
>
> /b
>


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

Månedens bedste
Årets bedste
Sidste års bedste