2017-05-05 21 views
-2

テキストファイルを一度に1文字ずつ読み込んで文字列(文字の配列)に送信すると、出力が正常に表示されているように見えますが、クラッシュします。どうして?C++ CharによるファイルCharの文字列への読み込み。クラッシュ

2番目の質問:文字列(文字の配列)に空白を追加するようには表示されません。どうして?

#include <iostream> 
#include <fstream> 
#include <string> 
#include <iomanip> 
#include <cctype> 
using namespace std; 

int main() 
{ 
    int SIZE = 0; 

    char text; 
    string textArray; 

    fstream inFile("text.txt"); //opens text.txt 

    //checks if file was opened 
    if (!inFile) 
    { 
     cout << "Error opening the file.\n"; 
     return 0; 
    } 

    //reads each character then adds the character to the array 
    while (inFile >> text) 
    { 
     //if you coment out line 46 and 47 the program wont crash 
     textArray[SIZE] = text; //comment out // doesnt add white spaces 
     cout << textArray[SIZE]; //comment out // the output form this is the text.txt but no white spaces 
     SIZE++; 
    } 
    inFile.close(); //closes text.txt 

    cout << SIZE; //output the size of the array 

    return 0; 
} 
+0

文字列が*ゼロ*長で作成されているため、存在しない '[]'を使用して文字列の文字を上書きしています。 'push_back()'を使用してください – Galik

+0

ありがとう、それはベクトルと関係がありますか?私はベクトルを認識していますが、これは初心者クラスであり、ベクトルはカバーされません。ベクトルなしでこれを行うにはとにかくありますか? – Edix

+0

'std :: string'と同じ' std :: vector'と同じです。あなたはチュートリアルを見つけて、それでも良い本を手に入れ、それを実践しなければなりません。 – Galik

答えて

2

When I am reading a text file one character at a time then sending that character to a string (which is an array of characters) it seems to work and the output shows correctly'ish but then it crashes. Why?

これは正しく動作する理由は運が原因です。既定の構成は

です。インプリメンテーションは、文字を入力するためのスペースを予約することができますが、これを行う必要はありません。あなたは、ストリームから読み込まれた各文字のためにこの文字列の末尾に文字をプッシュしたい場合は、このような何かを行うことができます。

while (inFile >> text) 
{ 
    cout << text; 
    textArray += text; 
} 

次に出力する文字列のサイズ、使用:

cout << textArray.size(); 

It doesn't appear to add white spaces to the string (which is an array of characters). Why?

これは、C++ストリームがテキストを読み込む方法によるものです。入力ストリームが

myInputStream >> myChar; 

または

myInputStream >> myString; 

を経由して文字または文字列に読み込むとき、それはあなたが取得した文字または文字列を与える前に、それがどんな先頭の空白をスキップすることができます。これは、ストリームフラグstd::ios_base::skipwsによって制御されます。この動作を無効にするには、呼び出し:

inFile.unsetf(std::ios_base::skipws); 
// OR 
inFile >> std::noskipws; 

この動作を再度有効にするには、呼び出し:すべてのreplysから

inFile.setf(std::ios_base::skipws); 
// OR 
inFile >> std::skipws; 
1
textArray[SIZE] = text; 

文字列のサイズよりも小さいかSIZEに等しいとき場所SIZEに書き込む未定義の動作です。文字を追加する

一つの正しい方法は次のとおりです。

textArray.push_back(text); 

あなたは全くSIZE変数は必要ありません。文字列のサイズはtextArray.size()から取得できます。

あなたはまだ、文字列の一部ではないアドレスにアクセスしようと
+1

「textArray + = text'だけではないのはなぜですか? – Tas

+0

@Tas操作は完全に同等です。 – cdhowie

+2

@Tasこの猫には、複数の方法があります: 'push_back'、' append'、 'operator + ='、 'operator +'です。それは本当にここの味の問題です。 – InternetAussie

0

it crashes. Why?

textArray[SIZE] = text;  SIZE++; 

あなたはstd::string.push_back(char c)

It doesn't appear to add white spaces to the string (which is an array of characters). Why?

てみ使用することができます。右後

fStreamVar >> std::noskipws; 

をあなたはファイルを開きます。

+0

あなたが正しく解釈している場合、出力は空白をスキップしています。しかし、彼らは実際には実際には文字列にありますか?私はファイルを開いた直後に追加しようとしましたが、エラーが発生しました:\t [エラー] qualified-idが ';'の前に宣言されています。 token – Edix

+0

これは実際のfstream変数のためであるとはっきりしないと思います。やってみよう。 –

+1

私はそれを考え出したので、私はwhileループに入れました。ありがとう! – Edix

0

みんなありがとうを以下は、私が探していたソリューションでした。

while (inFile >> std::noskipws >> text) 

textArray += text; 

それが何をしていたかやった理由を私は今理解しています。本当にありがとう!私の問題は、intで配列をやって、文字や文字列に切り替えるだけで脳が歪んでいたことです。

ありがとうございます!

関連する問題