2016-05-19 7 views
-3

私のプログラムの検索は、ファイル内の文字列であっても、別の関数呼び出しの存在の関数呼び出し誤動作、行番号を返し、その後、ちょうど行の前に、ファイルのすべての行をコピー検索された文字列の番号を別のファイルに格納する。しかし、私が神秘と見なす私の最大の驚きには、そうです。検索文字列の行番号は、ファイルコピー関数に渡され、代わりにファイルのコピー機能で定義された検索文字列の行番号の前にすべての行をコピーし、私はに変更した場合、それは逆 MYSTERY:理由だけで、彼らは無関係

  • をしている

    1. ファイルのコピー機能よりも大きい。つまり、検索された文字列の行番号の後にすべての行をコピーする必要があります。何もコピーされません。
    2. ファイルコピー機能に行番号を手動で入力する場合、つまり返される検索文字列の行番号を使用しない場合は、上記の1と2と同じことが起こります。
    3. 私は、検索文字列関数を削除し、手動でコピーファイル関数に行番号を入力した場合、最終的に、すべてのものは、行番号の前または後にラインをコピーするために、両方の方向すなわちに正常に動作します。 本当に、これは神秘です。助けてください? HERE

    謎を解決は、単に検索文字列関数を呼び出し、コピーファイルの関数を呼び出す前に、それを再開した後、ファイルを閉じているPROGRAM

    #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

    ようこそスタックオーバーフロー!デバッガを使用してコードをステップ実行する方法を学ぶ必要があるようです。良いデバッガを使用すると、プログラムを1行ずつ実行し、どこからずれているかを確認することができます。これはプログラミングをする場合に不可欠なツールです。さらに読む:[小さなプログラムをデバッグする方法](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。 –

    +3

    これらの関数は無関係ではありません。彼らは変更可能な参照を同じオブジェクト( 'fin')に渡し、与えられたものを変更します。 – chris

    +0

    @CaptainObvlious、私はOPの声明に異議を唱えていました。 OPは彼らが無関係であると述べており、これは否定の層を追加することによってこれが偽りの陳述であると明言した。 – chris

    答えて

    0

    です。これは、ファイルを使用するために別の関数が呼び出された後に関数が反映されることによる歪みを避けるために、ファイルにアクセスする複数の関数があるときは、一般的にはそれが望ましいです。 乾杯!

    関連する問題