/ 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
Søgning af streng i fil
Fra : Frank Christensen


Dato : 07-08-01 08:16

Hej

Er der nogle af jer der kan hjælpe mig med Subject?


--
Med venlig hilsen / Best regards

Frank Christensen

Datamech Apprentice

SJ Elektronik A/S
Holtvej 2-4
DK-6400 Sonderborg

Work: (+45) 74416565
Fax: (+45) 74415760

E-mail: frc@sje.dk



 
 
Bertel Lund Hansen (07-08-2001)
Kommentar
Fra : Bertel Lund Hansen


Dato : 07-08-01 08:44

Frank Christensen skrev:

>Er der nogle af jer der kan hjælpe mig med Subject?

Her er et simpelt skelet til et program der afbryder læsning så
snart strengen er fundet:

#include <stdio.h>
#include <string.h>

enum { LINMAX = 300 };

FILE *Indfil;
char Linje[LINMAX], Search[LINMAX];


int main() {
strcpy(Search,"Find mig!");

Indfil=fopen("Test.c","r");
while (!feof(Indfil)) {
fgets(Linje,LINMAX,Indfil);
if (strstr(Linje,Search)) {
printf(" Hurra! \n");
fclose(Indfil);
return 1;
}
}
fclose(Indfil);
return 0;
}

--
Bertel
http://lundhansen.dk/bertel/   FIDUSO: http://fiduso.dk/

Frank Christensen (07-08-2001)
Kommentar
Fra : Frank Christensen


Dato : 07-08-01 09:07

Tusind tak:)

Bertel Lund Hansen wrote:

> Frank Christensen skrev:
>
> >Er der nogle af jer der kan hjælpe mig med Subject?
>
> Her er et simpelt skelet til et program der afbryder læsning så
> snart strengen er fundet:
>
> #include <stdio.h>
> #include <string.h>
>
> enum { LINMAX = 300 };
>
> FILE *Indfil;
> char Linje[LINMAX], Search[LINMAX];
>
> int main() {
> strcpy(Search,"Find mig!");
>
> Indfil=fopen("Test.c","r");
> while (!feof(Indfil)) {
> fgets(Linje,LINMAX,Indfil);
> if (strstr(Linje,Search)) {
> printf(" Hurra! \n");
> fclose(Indfil);
> return 1;
> }
> }
> fclose(Indfil);
> return 0;
> }
>
> --
> Bertel
> http://lundhansen.dk/bertel/ FIDUSO: http://fiduso.dk/

--
Med venlig hilsen / Best regards

Frank Christensen

Datamech Apprentice

SJ Elektronik A/S
Holtvej 2-4
DK-6400 Sonderborg

Work: (+45) 74416565
Fax: (+45) 74415760

E-mail: frc@sje.dk



Thorbjørn Ravn Ander~ (08-08-2001)
Kommentar
Fra : Thorbjørn Ravn Ander~


Dato : 08-08-01 21:51

Bertel Lund Hansen wrote:

> enum { LINMAX = 300 };
>
> FILE *Indfil;
> char Linje[LINMAX], Search[LINMAX];

Lige en bemærkning. Dit program indeholder ikke check for at de
indlæste linier kan være i din 300 tegns buffer. Det er derfor muligt
for en ond person at lave lange linier hvis indhold overskriver dele som
ikke har noget med dine strenge at gøre.

Dette er - desværre - en meget hyppig fejl i C, fordi det er så let at
gøre.

--
Thorbjørn Ravn Andersen "...plus... Tubular Bells!"
http://bigfoot.com/~thunderbear



Bertel Lund Hansen (08-08-2001)
Kommentar
Fra : Bertel Lund Hansen


Dato : 08-08-01 23:28

Thorbjørn Ravn Andersen skrev:

>Lige en bemærkning. Dit program indeholder ikke check for at de
>indlæste linier kan være i din 300 tegns buffer.

Korrekt.

>Det er derfor muligt for en ond person at lave lange linier hvis indhold overskriver dele som
>ikke har noget med dine strenge at gøre.

Nej. Det kan lade sig gøre med gets(). Det kan ikke lade sig gøre
med fgets() som højst indlæser det specificerede antal tegn.

>Dette er - desværre - en meget hyppig fejl i C, fordi det er så let at gøre.

Ja, og derfor bør man f.eks. bruge fgets(buffer,LINMAX,stdin) som
en sikker tastaturinputrutine.

--
Bertel
http://lundhansen.dk/bertel/   FIDUSO: http://fiduso.dk/

Thorbjørn Ravn Ander~ (10-08-2001)
Kommentar
Fra : Thorbjørn Ravn Ander~


Dato : 10-08-01 12:24

Bertel Lund Hansen wrote:

> Thorbjørn Ravn Andersen skrev:
>
> >Lige en bemærkning. Dit program indeholder ikke check for at de
> >indlæste linier kan være i din 300 tegns buffer.
>
> Korrekt.
>
> >Det er derfor muligt for en ond person at lave lange linier hvis indhold overskriver dele som
> >ikke har noget med dine strenge at gøre.
>
> Nej. Det kan lade sig gøre med gets(). Det kan ikke lade sig gøre
> med fgets() som højst indlæser det specificerede antal tegn.

Den lille krølle havde jeg overset. Det vil så sige at din kode afskærer linier til 300 tegn,
inden viderbehandling. I det aktuelle tilfælde er det ligemeget, da linien ikke skal bruges
senere, men det er det jo ikke sikker at det gør.

Har du et forslag til hvordan det kan gøres robust og korrekt?


> >Dette er - desværre - en meget hyppig fejl i C, fordi det er så let at gøre.
>
> Ja, og derfor bør man f.eks. bruge fgets(buffer,LINMAX,stdin) som
> en sikker tastaturinputrutine.

Men med samme problem som før

--
Thorbjørn Ravn Andersen "...plus... Tubular Bells!"
http://bigfoot.com/~thunderbear



Bertel Lund Hansen (10-08-2001)
Kommentar
Fra : Bertel Lund Hansen


Dato : 10-08-01 13:32

Thorbjørn Ravn Andersen skrev:

>Den lille krølle havde jeg overset. Det vil så sige at din kode afskærer linier til 300 tegn,
>inden viderbehandling.

Ja. Jeg skrev eksemplet kort, men jeg bruger samme rutine til
læsning af visse tekstfiler hvor jeg ved at linjelængden ikke
overstiger 300 (bl.a. HTML-filer som jeg selv har skrevet). Som
en lille krølle kan jeg fortælle dig at strenge i TP op til
7'eren var begrænset til højst 255 tegn.

>Har du et forslag til hvordan det kan gøres robust og korrekt?

Ja, men det koster lidt hukommelse. Sæt LINMAX til f.eks. 10'000
bytes, erklær én buffer med den størrelse, og allokér strengene
dynamisk hvor du benytter bufferens aktuelle længde som antal.

Hvis du vil have en metode der kan læse vilkårligt lange rækker
af tegn, må du hente dem som bytes i en buffer, løbende flytte
dem over i en streng der skifter længde hele tiden, og selv holde
øje med om der dukker et linjeskift op undervejs.

--
Bertel
http://lundhansen.dk/bertel/   FIDUSO: http://fiduso.dk/

Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408522
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste