質問

テキストファイルをコピーするプログラムを作成しています。 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;
}

これをコンパイルすると、視覚的なCアサーション障害が発生します。 「Microsoft Visual C ++デバッグライブラリ」というタイトルのダイアログボックスがあります。

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

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

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

53行目

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

このエラーにより、3つのオプションが得られます:中止、再試行、または無視。中止はデバッグを停止するだけです。 Retryは、「プログラム。Exeがブレークポイントをトリガーした」という「Visual Studio」にメッセージを表示します。ここで[BREAK BREAK]をクリックすると、Visual Studioは「Fopen.C」というファイルを開き、このファイルの54行目を指します。

この時点から続行すると、Visual Studioが「dbghook.c」と呼ばれる別のファイルを開き、62行目へのポインターを開きます。

役に立ちましたか?

解決

エラーはどこですか?の上 fin また fout?対応するものを確認してください filenameXX, 、そうではないはずです NULL

他のヒント

また filenamein また filenameout outはnullです。したがって、エラーです。使用する場合 std::string C文字列の代わりに、ヌルポインターを心配する必要はありません。あなたはすでに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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top