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