|
| Læse textfil i int og ikke ascii ??? Fra : !G! |
Dato : 15-02-02 10:52 |
|
Jeg har lavet et lille program til at søge i et textdokument efter et tal,
fx 42..
Men problemet er at når programmet læser textfilen læser den karakter for
karakter som Acsii værdier.
Så det vil sige at når jeg skriver leder efter tallet 42, så leder den efter
' * ' som har acsii værdien 42.
For hvis den skulle finde tallet 42, så er det ' 52 50 '....
Hvordan for man fortalt programmet at textfilen ikke skal læses i acsii, men
med heltal..(int) ???
tak på forhånd
!G!
| |
Kent Friis (15-02-2002)
| Kommentar Fra : Kent Friis |
Dato : 15-02-02 10:57 |
|
Den Fri, 15 Feb 2002 10:52:13 +0100 skrev !G!:
>Jeg har lavet et lille program til at søge i et textdokument efter et tal,
>fx 42..
>Men problemet er at når programmet læser textfilen læser den karakter for
>karakter som Acsii værdier.
>Så det vil sige at når jeg skriver leder efter tallet 42, så leder den efter
>' * ' som har acsii værdien 42.
>For hvis den skulle finde tallet 42, så er det ' 52 50 '....
>
>Hvordan for man fortalt programmet at textfilen ikke skal læses i acsii, men
>med heltal..(int) ???
I c skal du bruge "fscanf" i stedet for "getch".
Mvh
Kent
--
Demokrati er lige som den 29. februar - begge dele forekommer
en gang hver fjerde år.
| |
Igor V. Rafienko (15-02-2002)
| Kommentar Fra : Igor V. Rafienko |
Dato : 15-02-02 22:24 |
|
[ Kent Friis ]
[ snip ]
> I c skal du bruge "fscanf" i stedet for "getch".
På en tilfeldig tekstfil? Yeah, right.
ivr
--
The C language combines all the power of assembly language with all
the ease-of-use of assembly language.
-- P. van der Linden "Expert C Programming"
| |
Igor V. Rafienko (15-02-2002)
| Kommentar Fra : Igor V. Rafienko |
Dato : 15-02-02 22:31 |
|
[ G. ! ]
> Jeg har lavet et lille program til at søge i et textdokument efter
> et tal, fx 42..
Let heller etter den _tekstlige_ representasjonen av tallet 42 (altså,
påfølgende siffre 4 og 2).
> Men problemet er at når programmet læser textfilen læser den
> karakter for karakter som Acsii værdier.
Det er ikke nødvendigvis slik.
> Så det vil sige at når jeg skriver leder efter tallet 42, så leder
> den efter ' * ' som har acsii værdien 42. For hvis den skulle finde
> tallet 42, så er det ' 52 50 '....
>
> Hvordan for man fortalt programmet at textfilen ikke skal læses i
> acsii, men med heltal..(int) ???
Det er uhyre lite lurt å forsøke å konvertere en inputfil til en
sekvens av tall (spesielt dersom filen inneholder en fin blanding) når
du _ikke_ trenger det: Let heller etter påfølgende '4' og '2':
<hele alfabete> - ['2']
+------------------+
| |
v |
+-----+ '4' +----+----+ '2' +-----+
|start|--------->|tilstand1|------->|slutt|
+-----+ +---------+ +-----+
| ^
| |
/ \
| |
\---/
<hele alfabetet> - ['4','2']
(DFAer i ASCII art er definitivt ikke min sterke side). Piler
representerer et kall på fgetc. Målet er naturligvis sluttilstanden.
ivr, artist-mode er nok tingen.
--
Death by snoo-snoo
| |
Bjarne Laursen (20-02-2002)
| Kommentar Fra : Bjarne Laursen |
Dato : 20-02-02 12:44 |
|
igorr@ifi.uio.no (Igor V. Rafienko) wrote:
> <hele alfabete> - ['2']
> +------------------+
> | |
> v |
> +-----+ '4' +----+----+ '2' +-----+
> |start|--------->|tilstand1|------->|slutt|
> +-----+ +---------+ +-----+
> | ^
> | |
> / \
> | |
> \---/
> <hele alfabetet> - ['4','2']
>
>(DFAer i ASCII art er definitivt ikke min sterke side). Piler
>representerer et kall på fgetc. Målet er naturligvis sluttilstanden.
Jeg er også tilhænger af state-mashines. Der har man bedst styr på
tingene.
Hvad med xxxx442xxx ? Skal det genkendes må der en ekstra '4' sløjfe
omskrig 'tilstand1'
-Bjarne
| |
Igor V. Rafienko (20-02-2002)
| Kommentar Fra : Igor V. Rafienko |
Dato : 20-02-02 15:18 |
|
[ Bjarne Laursen ]
[ snip ]
> Hvad med xxxx442xxx ? Skal det genkendes må der en ekstra '4' sløjfe
> omskrig 'tilstand1'
Det har du helt rett i. Takk for rettelsen.
ivr
--
The C language combines all the power of assembly language with all
the ease-of-use of assembly language.
-- P. van der Linden "Expert C Programming"
| |
hurra (19-02-2002)
| Kommentar Fra : hurra |
Dato : 19-02-02 23:20 |
|
Jeg ved ikke om det her er noget, men det virker da vist. Efter dette
stykke kode, vil position var den værdi hvor starten af tallet første
gang forekommer i din fil.
#include <stdio.h>
{
FILE *Fil;
int Tal = 42, Position=-1;
if ((Fil = fopen("test.txt", "rt")) != NULL)
{
char tp[2];
tp[1] = fgetc(Fil);
for (int i=0; !feof(Fil); i++)
{
int Input;
tp[0] = tp[1];
tp[1] = fgetc(Fil);
sscanf(tp, "%d", &Input);
if(Input == Tal)
{
Position = i;
break;
}
}
fclose(Fil);
}
}
--
Leveret af:
http://www.kandu.dk/
"Vejen til en hurtig løsning"
| |
Igor V. Rafienko (20-02-2002)
| Kommentar Fra : Igor V. Rafienko |
Dato : 20-02-02 15:31 |
|
[ hurra.news@kandu.dk ]
> Jeg ved ikke om det her er noget, men det virker da vist. Efter
> dette stykke kode, vil position var den værdi hvor starten af tallet
> første gang forekommer i din fil.
Nei, det virker _ikke_:
1) feof slår til _alfor_ sent
2) sscanf vil ha en '\0' på slutten.
3) koden vil tryne noe helt forjævlig på input som ikke er tall
4) koden vil ikke takle store filer på platformer med "små" int'er i
forhold
5) "t" er _ikke_ et gydlig flagg for fopen (r, w, +, a, b er det)
Har jeg glemt noe?
[ snip ]
ivr
--
Do that, and the best you can hope for is that people will ignore
you. More realistically, you'd be skinned alive, or possibly sentenced
to ten years of hard labor writing microcode for waffle irons and
toaster ovens. -- S. Meyers, "Effective C++", item 31
| |
|
|