2016-05-19 8 views
-3

Mein Programm sucht nach einer Zeichenfolge in einer Datei, gibt die Zeilennummer zurück und kopiert dann alle Zeilen der Datei direkt vor der Zeile Nummer der gesuchten Zeichenfolge, in eine andere Datei. Aber zu meiner größten Überraschung, die ich für ein GEHEIMNIS halte, ist das;MYSTERY IN C++: Funktionsaufruf nur wegen des Vorhandenseins eines anderen Funktionsaufrufs fehlerhaft, obwohl sie nichts miteinander zu tun haben

  1. , wenn die gesuchte Zeichenfolge Zeilennummer in die Datei-Kopierfunktion übergeben wird, statt dem Kopieren aller Zeilen vor der Zeichenfolge Zeilennummer gesucht, wie in der Datei Kopierfunktion definiert, tut es das Gegenteil
  2. wenn ich ändere größer als in der Dateikopierfunktion, dh so, dass alle Zeilen nach der gesuchten Zeichenfolgenzeilennummer kopiert werden sollen, wird überhaupt nichts kopiert.
  3. wenn ich stattdessen manuell eine Zeilennummer in der Dateikopierfunktion eingibt, d. H. Nicht die zurückgegebene Suchstringzeilennummer, geschieht dasselbe wie in 1 und 2 oben.
  4. schließlich, wenn ich die Suchzeichenfolgefunktion entfernen und manuell eine Zeilennummer in die Kopierdateifunktion eingeben, funktioniert alles in beiden Richtungen gut, d. H. Für das Kopieren von Zeilen vor oder nach der Zeilennummer. Wirklich, das ist ein Geheimnis. BITTE WER HELFEN KANN?

IST HIER DAS PROGRAMM

#include <fstream> 
    #include <iostream> 
    #include <cstdlib> 
    #include <string> 

std::ifstream fin; 
std::ofstream fout; 
void Copyfile(std::ifstream& in_stream, std::ofstream& out_stream, std::string Line,int searchstringline); 
int searchString(std::ifstream& in_stream, std::string string1); 

int main(){ 

    fin.open("C++.txt"); 
    if (fin.fail()) 
    { 
     std::cout << "Output file opening failed.\n"; 
     exit(1); 
    } 
    fout.open("Temp.txt",std::ios::app); 
    if (fin.fail()) 
    { 
     std::cout << "Input file opening failed.\n"; 
     fin.close(); 
     exit(1); 
    } 

    int searchstringline; 
    searchstringline = searchString(fin, "main"); 
    Copyfile(fin, fout, "line", searchstringline); 



} 



void Copyfile(std::ifstream& in_stream, std::ofstream& out_stream, std::string Line, int searchstringline){ 
    int count = 0; 
    for (int i = 0; getline(fin,Line); i++){ 
     count++; 
     while (count < searchstringline){ 
      out_stream << Line << std::endl; 
      break; 
     } 

    } 


} 

int searchString(std::ifstream& in_stream, std::string string1){ 
    std::string input; 
    int number = 0; 
    for (int i = 0; getline(fin, input); i++){ 
     number++; 
     if (input.find(string1) != std::string::npos){ 

      break; 
     } 

    } 
    return number; 
} 
+4

Willkommen bei Stack Overflow! Es klingt, als müssten Sie lernen, wie Sie mit einem Debugger Ihren Code durchgehen. Mit einem guten Debugger können Sie Ihr Programm Zeile für Zeile ausführen und sehen, wo es von dem, was Sie erwarten, abweicht. Dies ist ein essentielles Werkzeug, wenn Sie programmieren wollen. Weiterführende Literatur: [Wie kleine Programme zu debuggen] (http://ericlippert.com/2014/03/05/how-to-debug-small-programs/). –

+3

Diese Funktionen sind nicht unabhängig. Sie nehmen modifizierbare Referenzen auf das gleiche Objekt ("fin") und modifizieren, was ihnen gegeben wurde. – chris

+0

@CaptainObvlious, ich habe die Aussage des OP bestritten. Das OP erklärte, dass sie nicht verwandt sind, und ich habe ausdrücklich gesagt, dass dies eine falsche Aussage war, indem eine Negationsschicht hinzugefügt wurde. – chris

Antwort

0

Die Lösung des Rätsels einfach die Datei schließt, nachdem der Suchzeichen Funktion aufrufen und es vor dem Aufruf der Funktion Copyfile wieder zu öffnen. Dies ist im Allgemeinen immer dann ratsam, wenn Sie mehr als eine Funktion haben, die auf eine Datei zugreift, um Verzerrungen aufgrund einer Funktion zu vermeiden, die nach dem Aufruf einer anderen Funktion zur Verwendung der Datei auftritt. Prost!

Verwandte Themen