[prolog] Problemen met inlezen textfile

Pagina: 1
Acties:

  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 02-08 20:09
Ik wil een tekstfile inlezen, maar ik heb alles al geprobeerd en het wil maar niet. Ik zit met de handen in het haar.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
browse(F) :-
    see(F),
    processfile,
    see(user),
    seen.

processfile :-
    read(Term),
    process(Term).

    process(end_of_file) :- !.

process(X) :-
    write('woord:'), write(X),
    processfile.


In het bestandje test.txt staat de tekst:
Hoera! De tekst is succesvol ingelezen. Als je dit kunt lezen is er geen bufferoverflow.
Nu geef ik:
browse("test.txt").

en dan geeft hij de fout:
Afbeeldingslocatie: http://home.wanadoo.nl/dangerous-minds/fotos/amzi_error.gif

Waar ligt dit aan?

[ Voor 6% gewijzigd door Mastermind op 28-10-2003 14:56 ]


Verwijderd

Je hebt in de code hier een punt staan achter "process(Term)", heb je dat ook in je programma code?

  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 02-08 20:09
ik gok de buffer waarin hij stukjes leest... en dat die vol zit ofzo...

Maar eigenlijk zou die Term continu moeten updaten...en dan snap ik niet dat er 'een' buffer vol kan raken eigenlijk...

okay dit werkt:

browse(F) :-
see(F),
/*processfile,*/
see(user).

dus dat betekent dat see() geen problemen geeft...

Dan ligt het aan read. Maar wat is er mis :?

[ Voor 6% gewijzigd door Mastermind op 28-10-2003 14:58 ]


Verwijderd

Verwijderd schreef op 28 October 2003 @ 14:57:
Je hebt in de code hier een punt staan achter "process(Term)", heb je dat ook in je programma code?
Edit: Laat maar, ik las je code scheef. O-)

  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 02-08 20:09
Verwijderd schreef op 28 October 2003 @ 14:57:
Je hebt in de code hier een punt staan achter "process(Term)", heb je dat ook in je programma code?
Uh ja, dat was een typefout, maar ik heb het zovaak geprobeerd (dus ook zonder die typefout).

Ik heb het ff in een komma veranderd maar hij geeft dezelfde error.

Het ligt aan de readbuffer ofzo, ik snap er geen drol van 8)7

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 20-08 00:10
Jammer dat je een melding krijgt over read_/2 die je helemaal niet gebruikt; niet zo'n mooie melding van die interpreter.

Ik heb wel wat moeite met je recursieconstructie:
Prolog:
1
2
3
4
5
6
7
8
processfile :-
    read(Term),
    process(Term),
    process(end_of_file) :- !.

process(X) :-
    write(X),
    processfile.

Klopt de code zo? Ik weet niet hoe file I/O werkt in joiw Prolog-variant, maar volgens mij blijf je zo oneindig vaak doorlezen. Immers, als je een term hebt gelezen, roep je write process aan, die processfile aanroept, en dan wil je nog een term lezen (en ga zo maar door). Uiteindelijk kan je geen term meer lezen (en dan zou 'ie moeten backtracken, lijkt me, maar misschien gaat dat fout).

Is het niet zo dat je eerst wil proberen om end-of-file te lezen en als dat niet kan (einde nog niet bereikt) een term wil lezen en processen? De code wordt dan zoiets:

Prolog:
1
2
3
4
5
6
7
8
9
processfile :-
    read(end_of_file).
processfile :-
    read(Symbol),
    process(Symbol).

process(Symbol) :-
    write(Symbol),
    processfile.

Als het goed is wordt er alleen gebacktracked op die "read(end_of_file)" dus als het goed is heb je verder geen cuts nodig (tenzij je die erbij wil zetten om ten behoeve van de performence de recursie te beperken).

Ik moet zeggen dat ik de oplossing een beetje in elkaar gegokt hebt; als je een wat nauwkeurigere uitleg wilt hebben, moet je maar even vermelden met welke Prolog-implementatie je werkt en een link naar de I/O documentatie plaatsen. ;)

[ Voor 6% gewijzigd door Soultaker op 28-10-2003 15:18 ]


  • Almeros
  • Registratie: September 2001
  • Laatst online: 26-02-2021
Ik werk samen met Mastermind voor een schoolopdrachtje hieraan...


code:
1
process(end_of_file) :- !.


Hierbij is end_of_file een standaard Atom in AMZI prolog die aangeeft dat het einde van de file gevonden is. Als dit 'true' is om het maar even zo te noemen, dan geeft de ! aan dat gestopt moet worden. Verder wordt in
code:
1
2
3
process(X) :-
    write('woord:'), write(X),
    processfile.

'processfile' nog eens aangeroepen waardoor de volgende 'Term' wordt gelezen... En AMZI prolog handelt de pointerverwijzing in de file af dus verplaatst hem naar de volgende Term...

We ploeteren nog fijn door.... Meer ideen zijn ZEER welkom :)

[ Voor 19% gewijzigd door Almeros op 28-10-2003 15:51 ]


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 20-08 00:10
Ah ok, door de vage indenting had ik de code verkeerd geinterpreteert... maar doe eens een linkje naar de I/O documentatie? En met welke Prolog-variant werken jullie?

  • Almeros
  • Registratie: September 2001
  • Laatst online: 26-02-2021
Nou we gebruiken een boek die op de eerste prolog implementatie is gebaseerd namelijk DEC-10 (of ook wel Edinburgh syntax)....

Maar ik begin nu toch wat te twijvelen ondertussen of AMZI prolog hier wel aan voldoet... (wat ze dacht ik wel beweerden)

Dat ga ik ff onderzoeken...

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 20-08 00:10
Ik heb hier wat documentatie gevonden, ook over Input and Output.

Volgens mij is jullie code gewoon goed. In het voorbeeld gebruiken ze echter open in plaats van see; dat zou niet uit moeten maken, maar misschien kun je toch proberen of het daar aan ligt?

  • Almeros
  • Registratie: September 2001
  • Laatst online: 26-02-2021
Klopt als een bus... ik was er ook net. Nouja bedankt iig!

Als dit niet gaat werken dan breekt m'n klomp ;) Maar we laten het wel ff weten nog...
Pagina: 1