Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Text einlesen und filtern ?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
08.06.2003, 19:14 Uhr
~Kathrin
Gast


Bin dabei ein Filter zu schreiben der ein txt Datei nach gewissen ansprüchen Filtert.
z.B.:cat test2.txt | ./filter -u (-u bedeutet gib mir nur die Großbuchstaben aus)

Das Problem ist das die Textdatei nur solange gefiltert wird bis eine neue Zeile beginnt bzw. bis es ein Absatz gibt. Also quasi immer nur die erste Zeile. Wie kann das gesamte Text Dokument durchsuchen lassen ?
Hier mal ein Codeauschnitt:



C++:
switch(argv[1][1]) {
    case 'u':
        printf("Zeige alle Großbuchstaben:\n");
                
        while (text[i++] != '\0') {
            c=text[i-1];
            gbi = isupper(c);
                if (gbi==256) {
            printf("%c", c);
            }
            }
        printf("\n");
        break;



Vielen Dank für Eure Hilfe !!!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
08.06.2003, 20:03 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Hi,
probier mal so:

C++:
int main (){

FILE *fp;
char c;
fp=fopen("test.txt","rb");

while(!feof(fp)) if(isupper(c=fgetc(fp))) printf("%c",c);

fclose(fp);

return 0 ;

}



Gruss Heiko
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
08.06.2003, 20:12 Uhr
~Kathrin
Gast


Sorry ich hatte vergessen zu erwähnen das ich ohne Fopen und den FILE optionen etc. arbeiten muß. (Praktikum für die Schule). Sonst würde es nämlich gut funktionieren...!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
08.06.2003, 20:30 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Tut mir leid,
ich bin reiner windows-user

kann dir also keinen code geben den ich testen kann.

Vermute aber mal das dein problem darin liegt das du nicht richtig mit argv arbeitest.
Der mach bestimmt bei jedem leerzeichen und jeder neuen zeile oder tabulator und was es sonst noch so für trennzeichen gibt einen neuen string auf

lass dir das was in den argv's steht mal ausgeben


Gruss Heiko
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 08.06.2003 um 20:35 Uhr von Heiko editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
08.06.2003, 21:53 Uhr
ao

(Operator)



Zitat:
~Kathrin postete

C++:
switch(argv[1][1]) {
    case 'u':
        printf("Zeige alle Großbuchstaben:\n");
                
        while (text[i++] != '\0') {
            c=text[i-1];
            gbi = isupper(c);
                if (gbi==256) {
            printf("%c", c);
            }
            }
        printf("\n");
        break;





Was ist denn das für ein Vergleich mit 256? Das Ergebnis von isupper ist doch einfach nur ein bool-scher Wert, d.h. 0 ist false und jeder Wert ungleich 0 ist true. Ich würde lieber auf if(gbi) oder if(gbi != 0) testen.

Und in der while-Schleife zuerst i hochzählen und dann doch wieder ein Element tiefer nachsehen ist zwar nicht falsch, aber doch irgendwie verwirrend. Es ist immer fehlerträchtig, wenn ein Programmierer sich solche Dinge merken muß. Hier fände ich es klarer, immer auf text((i)) (*) zuzugreifen und erst am Ende i++ zu machen. Aber das ist nur meine Privatmeinung.

(*) statt ((i)) hier bitte i in [] setzen; wenn ich das mache, versteht das Forum das als kursive Formatierung. :-$


Für die Frage, wie du den gesamten Text auswerten kannst, schließe ich mich Heiko an und empfehle, mal rauszukriegen, wie die shell dein Programm füttert, also testweise zu Programmbeginn so was wie

C++:
for (i = 0; i < argc; i++)
    printf ("%s\n", argv[i]);


zu machen.

Vielleicht ist danach schon alles klar.

ao

Dieser Post wurde am 08.06.2003 um 21:57 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
08.06.2003, 22:11 Uhr
~Kathrin
Gast


Das ist der rest des Programms!
Vielleicht hilft das eher...! Sorry ich komm einfach nicht weiter...!


C++:
#include <stdio.h>

#define MAX 10000

int main(int argc, char *argv[])
{
char text[MAX], c, x=x, y;
int i=0, gbi=0, kbi=0;
int max_words=1;


fgets(text,MAX,stdin);

if(argc < 2) {
     printf("Hier der eingelesene Text: %s",text);
     exit(0);
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
08.06.2003, 22:28 Uhr
~Kathrin
Gast


Es liegt an dem fgets ! Start ich mein filter Programm ohne Argumente wird ja einfach der Text nochmal ausgegeben. Dann fehlen schon die restlichen Sätze! Fgets liest solange ein wie der erste Absatz kommt.

Steht also in mein test.txt File z.B. folgendes:
----------------------
C macht Spass.
Hallo wie gehts.
Die kuh macht muh.
-------------------------
und ich starte mein Filter: cat test2.txt | ./filter
...so wird nur "C macht Spass" eingelesen!

Wie kann ich das komplette txt File einlesen ohne die schon erwähnte Lösung von Heiko zu benutzen ? Wenns denn überhaupt geht... ? Ich als Anfänger bin mit meinem Latein am Ende...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
08.06.2003, 22:29 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


lass dir doch mal zumindest argc ausgeben. Wenn das gröser als 2 ist heisst das doch das der mehr als 2 argumente übergeben bekommen hat. Was also bedeuten würde das irgendwo dein -u und der ganze rest von dem inhalt deiner Textdatei belegt ist.

Was steht denn in deiner Textdatei drin und wie sieht denn die ausgabe von argv nun aus

lass mal folgendes Programm mit diesem aufruf: cat test2.txt | ./filter -u duchlaufen und sag uns was der für ne ausgabe rausbekommt

In test.txt sollte natürlich irgendein fiktiver Text drinstehen


C++:
#include "stdio.h"
#inlclude "stdlib.h"
int main(int argc, char *argv[]){

printf("Anzahl Argumente: %d\n", argc);

for (i = 0; i < argc; i++)
    printf ("%s\n", argv[ i ]);

}



Gruss Heiko
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 08.06.2003 um 22:59 Uhr von Heiko editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
08.06.2003, 23:00 Uhr
~Kathrin
Gast


Habs in mein Programm eingefügt!
Die Ausgabe sieht so aus:

Anzahl Argumente: 2
./filter
-l
Zeige alle Kleinbuchstaben:
llowiegehtsdirdennhastdueinenschoeneaggehabt


Funktioniert soweit! Allerdings wurde wieder nur der Erste Satz aus der Textdatei genommen bis zum zum ersten Zeilenumbruch bzw Enter!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
08.06.2003, 23:03 Uhr
~Kathrin
Gast


Muss mich verbessern! SChreibe ich die Sätze alle aneinander, spielt selbst ein Zeilenumbruch keine Rolle! Es liegt also nur am ENTER wenn ich künstlich einen neuen Absatz einfüge...!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: