2010-12-07 25 views
6

ファイル全体をchar配列に読み込もうとしています。しかし、いくつかの問題を抱えています。]テキストファイルをchar配列に読み込みます。 C++ ifstream

ifstream infile; 
infile.open("file.txt"); 

char getdata[10000] 
while (!infile.eof()){ 
    infile.getline(getdata,sizeof(infile)); 
    // if i cout here it looks fine 
    //cout << getdata << endl; 
} 

//but this outputs the last half of the file + trash 
for (int i=0; i<10000; i++){ 
    cout << getdata[i] 
} 
+0

それとも誰かがchar型の配列にテキストファイルを保存するためのより良い方法を提案することができます。 – nubme

+0

おもちゃのアプリ以外でこれを行う場合は、無制限のメモリ割り当てに対する保護を確実にしてください。 – seand

+2

いくつかのセミコロンがありません。 –

答えて

1

新しい行を読むたびに古い行を上書きします。インデックス変数iを保持し、infile.read(getdata+i,1)を使用してiをインクリメントします。

+0

ありがとう、それはそれを修正! =] – nubme

+2

'read(...、1)'は一度に1文字を読みます...非常に非効率です。 –

+0

infile.seekg(0、ios :: end); int len = infile.peekg(); infile.seekg(0、ios :: beg); infile.read(getdata、len); – tmiddlet

2

ファイル全体をバッファに吸い込む予定がある場合は、1行ずつ読む必要はありません。

char getdata[10000]; 
infile.read(getdata, sizeof getdata); 
if (infile.eof()) 
{ 
    // got the whole file... 
    size_t bytes_really_read = infile.gcount(); 

} 
else if (infile.fail()) 
{ 
    // some other error... 
} 
else 
{ 
    // getdata must be full, but the file is larger... 

} 
+0

ファイルが '10000'文字より大きければどうなりますか? – Nawaz

+0

@Nawazはelse節になります.... –

+0

....そしてあなたはそこで何をするつもりですか?より大きなサイズの別のchar配列を宣言し、再度読み込みますか?間違っていませんか? – Nawaz

2
std::ifstream infile; 
infile.open("Textfile.txt", std::ios::binary); 
infile.seekg(0, std::ios::end); 
size_t file_size_in_byte = infile.tellg(); 
std::vector<char> data; // used to store text data 
data.resize(file_size_in_byte); 
infile.seekg(0, std::ios::beg); 
infile.read(&data[0], file_size_in_byte); 
3

使用std::string

std::string contents; 

contents.assign(std::istreambuf_iterator<char>(infile), 
       std::istreambuf_iterator<char>()); 
+0

...いつもこの呪文を覚えるのに困っていた。非常に直感的ではありません。 PS。 OPはchar配列を要求しているので、 'contents.c_str()'を使うことができます。 – gluk47

関連する問題