1

次のコードを使用してテキスト ファイルを読み込もうとしています。

void function readfile(char *inputfile) {
istream is;
int filesize = 0;

is.open(inputfile);
if (!is.is_open()) {
 return;
}
is.seekg(0, ios::end);
filesize = (int)is.tellg();
is.seekg(0, ios::beg);

char *buf = new char[filesize];
is.read(buf, filesize);
is.close();

cout << buf << endl;

delete[] buf;
return;
}

g++ (mac / macports) では正しく動作しますが (動的に割り当てられた char* 配列にすべてのコンテンツを取得します)、Visual Studio C++ 2010 では、次のタイプの定数エラーが発生します: Debug assertion failed: (unsigned)(c+1) <= 256, file isctype.c.

問題は、ファイルを開きますが、終了区切り文字が見つからないため、eof に到達すると別の場所 (文字化け文字) の読み取りを開始することです。を使用するcout << buf;と、Mac ではファイルが正しく読み取られていることがわかりますが、Visual C++ ではより多くのガベージ文字が入力されます。ここで何が問題なのですか?

4

2 に答える 2

1

C++ 標準ライブラリに作業を任せます。

void readfile(const char *inputfile) {
    std::ifstream is(inputfile);
    std::string buf(std::istreambuf_iterator<char>(is), {});
    std::cout << buf << std::endl;
}

ほら 今も

  • 例外セーフ
  • 埋め込まれた NUL 文字を正しく処理する

もちろん、必要に応じてvector代わりに使用することもできstringます(その1つの単語を変更するだけです)

完全なデモ: Coliru でライブを見る

#include <fstream>
#include <iostream>
#include <iterator>

void readfile(const char *inputfile) {
    std::ifstream is(inputfile);
    std::string buf(std::istreambuf_iterator<char>(is), {});
    std::cout << buf << std::endl;
}

int main()
{
    readfile("main.cpp");
}

C++ 11 に挑戦したコンパイラの更新(およびベクトルの使用方法を示す):

Coliruでもライブ配信中

#include <fstream>
#include <iostream>
#include <iterator>
#include <vector>

void readfile(const char *inputfile) {
    std::ifstream is(inputfile);
    std::istreambuf_iterator<char> f(is), l;
    std::vector<char> buf(f, l);

    std::cout.write(buf.data(), buf.size());
}

int main()
{
    readfile("main.cpp");
}
于 2013-10-20T22:28:38.207 に答える