0

テキストファイルをコピーするプログラムを作成しています。filenamein配列で指定されたテキストファイルを読み取り、filenameout配列で指定されたテキストファイルのコピーを出力するmain.cppファイルがあります。この関数をFileUtilities.hで次のように宣言しています。

bool textFileCopy(char filenamein[], char filenameout[]);

次に、FileUtilities.cppには

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

#include "FileUtilities.h"

bool FileUtilities::textFileCopy(char filenamein[], char filenameout[])
{
    ifstream fin(filenamein);
    if(fin.is_open())
    {
        ofstream fout(filenameout);
    
        char c;
        while(fin.good())
        {
            fin.get(c);
            fout << c;
        }

        fout.close();
        fin.close();

        return true;
    }
    return false;
}

これをコンパイルすると、VisualCアサーションエラーが発生します。「MicrosoftVisualC++デバッグライブラリ」というタイトルのダイアログボックスが表示されます。このダイアログボックスには次のものが含まれています。

「デバッグアサーションに失敗しました!

プログラム:..... Parser.exe

ファイルf:\ dd \ vctools \ crt_bld \ Self_x86 \ crt \ src \ fopen.c

53行目

式:(ファイル!= NULL) "

このエラーにより、中止、再試行、無視の3つのオプションが表示されます。中止すると、デバッグが停止します。再試行すると、「program.exeがブレークポイントをトリガーしました」というメッセージがVisualStudioに表示されます。ここで[ブレーク]をクリックすると、Visual Studioは「fopen.c」というファイルを開き、このファイルの54行目を指します。

この時点から続行すると、VisualStudioは62行目へのポインターを含む「dbghook.c」という別のファイルを開きます。

4

2 に答える 2

3

エラーはどこにありますか?オンfinまたはfoutfilenameXX対応するを確認してください。NULL

于 2011-04-30T20:36:44.897 に答える
2

どちらかfilenameinまたはfilenameoutoutがnullであるため、エラーが発生します。C文字列の代わりに使用する場合はstd::string、nullポインタについて心配する必要はありません。すでにC++I / Oライブラリを使用しているので、を使用しない理由は実際にはありませんstd::string

get()とはいえ、抽出された文字を使用する前に呼び出しが成功したかどうかをチェックしないため、関数も正しくありません。trueまた、ファイルの途中でコピーが失敗した場合でも、を返します。

以下は、この関数の正しい実装です(ただし、ほぼ確実に最適ではないことに注意してください。これは、使用している関数を正しく記述する方法を示しているだけです)。

bool textFileCopy(std::string filenamein, std::string filenameout)
{
    // Open the input stream
    std::ifstream in(filenamein.c_str());
    if (!in)
        return false;

    // Open the output stream
    std::ofstream out(filenameout.c_str());
    if (!out)
        return false;

    // Do the copy
    char c;
    while (in.get(c) && out.put(c));

    // Ensure that the whole file was copied successfully
    return in.eof() && out;

}   // The input and output streams are closed when the function returns
于 2011-04-30T20:59:42.563 に答える