2016-04-15 10 views
-2

letzten drei Tage habe ich ein Problem .. Ich habe eine Datei mit Sätzen.Datei mit fgetc lesen und Sätze in verknüpfte Liste hinzufügen

Wenn ich Datei mit

int maxSize = 256; 
int currSize = 0; 
int i = 0; 
char *sentence = (char*)malloc(maxSize); 
char c; 

currSize = maxSize; 

while ((c = fgetc(input)) != EOF) 
{ 
    sentence[i++] = c; 

    while((c = fgetc(input)) != '\n') 
    { 
     sentence[i++] = c; 

     if((c == '.') || (c == '?') || (c == '!')) 
      sentence[i++] = '\n'; 

     if(i == currSize) 
     { 
      currSize = i + maxSize; 
      sentence = (char*)realloc(sentence,currSize); 
     } 
    } 
} 

sentence[i] = '\0'; 

addSentence(sentence); 

wenn Funktion addSentence Sätze in verknüpfte Liste ist das Hinzufügen gerade lese es ein Problem, weil es nur einen Satz von allen gemacht hinzufügen, was in der Datei ...

Ich bin Anfänger in C. Danke.

+0

Also im Grunde sagen Sie, dass das Problem in 'addSentence' liegt und nicht auf die Funktion bezogen ist, die Sie zeigen? – usr2564301

+1

Verwenden Sie 'int c;' anstelle von 'char c;', da 'fgetc()' ein 'int' zurückgibt, das einen beliebigen Wert enthalten kann, den ein' char' enthalten kann, plus einen zusätzlichen - EOF. –

+0

Es hängt mit der Funktion zusammen. Es geht um \ n, aber ich weiß nicht, wie ich es beheben kann:/ –

Antwort

1

Ihr Problem ist, dass Sie nur am EOF aufrufen, so dass es magisch nichts zu sehen bekommt, bevor Sie die ganze Datei gelesen haben. Vermutlich müssen Sie es aufrufen, wenn Sie das Ende eines Satzes erkennen (mit dem Test für , '?' oder '!') - Sie müssen auch vor dem Aufruf von addSentence die Zeichenfolge null beenden und den Speicher mit einer neuen Zuordnung und dem richtigen zurücksetzen Größe) sowie bei EOF. Es ist nicht klar, warum Sie zwei Schleifen haben; Sie könnten einige Zeilenumbrüche als Satzende verpassen. Nacharbeiten mit nur einer Schleife.

Es ist nicht ganz klar, wenn Zeilenumbrüche die Enden von Sätzen markieren. Diese Revision nimmt an, dass sie tun:

int maxSize = 256; 
int currSize = maxSize; 
int i = 0; 
int c; 
char *sentence = (char*)malloc(maxSize); 
assert(sentence != 0); // Not a production-ready error check 

while ((c = fgetc(input)) != EOF) 
{ 
    sentence[i++] = c; 

    if ((c == '\n') || (c == '.') || (c == '?') || (c == '!')) 
    { 
     if (c != '\n') 
      sentence[i++] = '\n'; 
     sentence[i] = '\0'; 
     addSentence(sentence); 
     sentence = malloc(maxSize); 
     assert(sentence != 0); // Not a production-ready error check 
     currSize = maxSize; 
     i = 0; 
    } 

    if (i == currSize) 
    { 
     currSize = i + maxSize; 
     sentence = (char*)realloc(sentence, currSize); 
     assert(sentence != 0); // Not a production-ready error check 
    } 
} 

sentence[i] = '\0'; 
addSentence(sentence); 

Beachten Sie, dass die Fehlerüberprüfung für fehlgeschlagene Speicherzuordnung nicht Produktionsqualität ist; Es sollte eine korrekte, bedingungslose Fehlerprüfung geben. Es besteht ein geringes Risiko eines Pufferüberlaufs, wenn das Ende der Satzzeichensetzung genau an der falschen Stelle liegt. Der Produktionscode sollte das ebenfalls vermeiden, aber es wäre findliger. Ich würde einen String-Datentyp und eine Funktion zum Hinzufügen verwenden. Ich nehme wahrscheinlich auch an, dass die meisten Sätze kürzer als 256 Zeichen sind (besonders wenn Zeilenumbrüche das Ende markieren) und würde maxSize von 64 verwenden. Dies würde dazu führen, dass weniger ungenutzter Speicher zugewiesen wird.

+0

Es fügt leere Sätze in die verknüpfte Liste ein:/ –

+0

OK; so fügen Sie eine Kontrolle über die Länge (und/oder den Inhalt) des Satzes hinzu, bevor Sie ihn hinzufügen.Dies würde beispielsweise passieren, wenn Sie am Ende einer Zeile einen Punkt (Punkt) haben. Sie könnten entscheiden, dass ein Satz voller Leerzeichen nicht interessant ist. Du musst nur deinen Weg durchdenken, was passiert. Und entscheiden Sie, was das gewünschte Verhalten ist. Wenn es mein Programm wäre, würde ich wahrscheinlich Zeilenumbrüche durch Leerzeichen ersetzen und Sätze nur hinzufügen, wenn passende Interpunktionen gefunden werden. Ich mache mir wahrscheinlich auch Sorgen über "zitierte Phrasen". Auf den Punkt folgt unmittelbar ein Doppelzitat (oder ein einfaches Zitat). –

+0

(Parenthetische Sätze wären auch problematisch.) Ganz zu schweigen ... Pausen mitten in einem Satz. Das ist ein Betrüger; es ist ein Unicode 'Ellipse'; du könntest auch ... (auf die altmodische Art geschrieben). Was ist mit Mr. Pascal? Sind das ein oder zwei Sätze? Das ist wirklich schwierig. Eines der schönen Dinge beim Programmieren ist, dass Sie Ihr Gehirn benutzen können. –