2011-09-13 27 views
-3

入力ストリームでユーザー入力を読み取るC/C++プログラムを作成しようとしています。C++、cinは改行で大きな文字列を読み取る

空白と改行を無視して大きなストリームを読み込みたいです。あなたは私を助けることができます?

このプログラムをJavaでRuntime.exec()で実行し、大きなXMLファイルを渡したいとします。どのように私はそれを実現することができますか考えていますか?

cout << "Source XML:" << endl; 
char* buffer = new char[10]; 
cin.read(buffer, 10); 

"a \ nb \ nc \ nd \ ne \ n"と入力すると奇妙な文字が生成されます。

私はこのような何かで読みたい:

<somedata> 
    <atag>value</atag> 
    ... 
</somedata> 
+0

CをまたはC++?プログラミング言語を選ぶのは、コードを書く前の良い考えです。 –

+0

私はcin.ignore()で実験しましたが、結果が得られませんでした。区切り文字を指定したくありません。私はそのszenarioの作成が最初は馬鹿だと知っていますが、私はファイルシステムに書き込み権限がないので、ファイルで行うことができます。 –

+0

@Kerrek:もちろんC++。ごめんなさい。 –

答えて

0

cin.readを、おそらくあなたはbuffer、そして他には何に入力された最初の10の文字が入りました。これには末尾のゼロが含まれます。末尾にゼロが追加されているようには見えないので、bufferを多く使用するとバッファオーバーランが発生し、未定義の動作につながります。通常、この未定義の動作は、必要な文字列の後に奇妙な文字のように見えます。最も簡単な解決法は、配列を1つ大きくし、最後の要素をゼロに設定することです。これにより、偶発的なエラーを防ぐことができます。など

cout << "Source XML:" << endl; 
char* buffer = new char[11]; 
cin.read(buffer, 10); 
buffer[10] = '\0'; //now buffer works with ALL string functions. 
としては、リサイズ、例外処理するので、コンテナは常に良い考えです、コメントでDeadMGによって指摘された

、メモリ管理、自動化されています。

cout << "Source XML:" << endl; 
std::vector buffer(11); 
cin.read(&buffer[0], 10); // &buffer[0] is a char* 
buffer.back() = '\0'; 
+0

私は配列を1つ大きくしました。ゼロに設定するとどういう意味ですか?私はメモリの例外はありませんが、今はまだ奇妙な文字が終わりです。 –

+0

これを変更しました \t cout << "ソースXML:" << endl; \t char * buffer = new char [sourceXmlSize + 1]; \tバッファ[sourceXmlSize] = 0; \t cin.read(buffer、sourceXmlSize); もう奇妙な文字はもうありません。ありがとう! –

+1

Downvote。常にリソース管理クラスを使用してください。 – Puppy

1

私は私はあなたの質問を理解していないが、それは多くのあなたのように聞こえるが、単純な書式付き入力が必要です。

#include <iostream> 
#include <string> 

int main() 
{ 
    std::string token; 
    while (std::cin >> token) 
    { 
    std::cout << "We read one token: " << token << std::endl; 
    // etc. 
    } 
} 

をあなたが何か違うものを望むなら、コメントを残してください。


更新:もう1つの答えをもとに、もう1つ追加してみましょう。生データをテキストトークンではなくバイナリとして読み取る場合は、実際にはreadを使用しますが、適切なバッファオブジェクトを読み込みます。あなたは、文字列が必要な場合は、必ず後から1を作成することができます。

std::vector<char> buf(10); 
std::cin.read(buf.data(), buf.size()); // or `&buf[0]` on older platforms 
std::string str(buf.data(), buf.size()); // you can pass `str` around now 
+0

'改行と空白を無視する'? –

+0

フォーマットされた入力は、*改行と空白をスキップします。それがOPの意味であるのかどうかは分かりませんが、XMLのようなものを読んでほしいと思うのですが... –

+0

私は 'cin.read(buffer、10);'の使い方を明確にしました。 –

0

あなたがバッファに全体の標準入力を読みたい場合は、この試してみてください。

#include <iostream> 
#include <sstream> 

int main() { 
    using std::cout; 
    using std::endl; 
    using std::cin; 
    using std::ostringstream; 
    using std::string; 

    cout << "Source XML:" << endl; 

    ostringstream oss; 
    oss << cin.rdbuf(); 

    cout << "---\n" << oss.str() << "\n---\n"; 
    // Or, ParseXML(oss.str.c_str()); 
} 

あるいは、(ほぼ同じ)の代替では、これを試してみてください。

#include <iostream> 
#include <string> 
#include <map> 
#include <algorithm> 
#include <vector> 

struct all_letters: std::ctype<char> { 
    all_letters() : std::ctype<char>(get_table()) {} 
    static mask const* get_table() { 
     static std::vector<mask> rc(table_size, alpha); 
     return &rc[0]; 
    } 
}; 

int main(int ac, char **av) 
{ 
    std::cin.imbue(std::locale(std::cin.getloc(), new all_letters())); 

    std::cout << "Source XML:" << std::endl; 

    std::string input; 
    std::cin >> input; 

    std::cout << "---\n" << input << "\n---\n"; 
    // Or, ParseXML(input.c_str()); 
} 
関連する問題