2016-05-01 9 views
3

からスプリット:a r3, r2, r1と私は個々の部品にこれを分割したいので、私は、R3、R2を保持する変数を持っており、 r1を個別に使うので、空白とコンマを削除する必要があります。私はこれを行う方法がわからない。私は検索したが、あらかじめ定義された文字列を持つ例(thisなど)しか見つからなかった。解析と、私は次の形式を持つテキストファイルから行を読み込むしたいテキストファイル

私は、ファイルからテキストを読み込むと、char型の配列にそれを配置する方法を知っているが、理想的には私は別の変数に行の各要素を配置したいと思います。

だから、のようなもの:

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

void main() 
{ 
    string var1, var2, var3, var4; 
    ifstream inFile("myfile.txt"); 

    if (inFile.is_open()){ 
     while (!inFile.eof()){ 
     inFile >> var1 >> var2 >> var3 >> var4; 
     } 
    } 
} 

が、それは空白、カンマ、改行を処理します。これを行う方法に関する提案はありますか?

+1

まず、[これをしない: 'しばらく(!inFile.eof())'](https://stackoverflow.com/questions/5605125/why-is-iostreameof-inside- a-loop-condition-considered-wrong)を指定します。 – WhozCraig

+0

'string.replace()?'カンマは空白です。また、 'string.erase()'のほうが良いでしょう。 'string.pop_back()'最後の文字ですか? –

答えて

1

std::getline(<stream>, <string>)で行を読むことができます。

std::string line; 
while(std::getline(inFile, line)) 
{ 
    // You successfully read a line. 
} 

行の末尾を指定std::getline()に3番目のパラメータが実際にあります。デフォルトではこれは '\ n'ですが、あなたはあなたのオンライン行末を指定します( '、')。あなたのラインはスペースで使用operator>>ではなくstd::getline()を分割された場合

std::stringstream lineStream(line); // convert your line into a stream. 

if (std::getline(lineStream, a, ',') && 
    std::getline(lineStream, r1, ',') && 
    std::getline(lineStream, r2, ',') && 
    std::getline(lineStream, r3, ',') 
    ) 
{ 
    // Read all the values successfully 
} 

。すべての

std::stringstream lineStream(line); // convert your line into a stream. 

if (lineStream >> a >> r1 >> r2 >> r3) 
{ 
    // Read all the values successfully 
} 
+0

私はあなたがオンラインで終わり '、'を意味するかどうかわかりません。私のラインは、(スペース)RA、RAの場合は、RC – Noobgineer

+0

'のstd :: getlineの()の3番目のパラメータを読み取ることでしょう\ nの以外にラインエンドがない'それはで読むのをやめますという文字があります。デフォルトでは ''\ n' 'で止まりますが、他の文字(''、 ''など)を使うことができます。あなたの単語aがスペースで区切られている場合、 'operator >>' –

+0

私の行はスペースやカンマで区切られます:a(スペース)r1、(スペース)r2、(スペース)r3 \ n – Noobgineer

0

は、最もエレガントなソリューションしかし、これらの線に沿って何かが動作します:

void parse_input(const std::string& _buffer, std::string& _s1, std::string& _s2, 
std::string& _s3, std::string& _s4); 

int main(void) { 
    std::ifstream inFile("foo.txt"); 

    std::string var1, var2, var3, var4; 
    std::string buffer = ""; 
    while(std::getline(inFile, buffer)) { 
     parse_input(buffer, var1, var2, var3, var4); 
    } 
} 

void parse_input(const std::string& _buffer, std::string& _s1, std::string& _s2, 
std::string& _s3, std::string& _s4) { 
    size_t count = 0; 
    // increment count until first space char 
    while (buffer.at(count) != ' ') { 
     ++count; 
    } 
    // set _s1 to substring of _buffer from start to first space 
    _s1 = _buffer.substr(0, count); 
    size_t prev_count = count; 
    // repeat above for comma char instead... 
    while (buffer.at(count) != ',') { 
     ++count; 
    } 
    _s2 = _buffer.substr(prev_count, count); 
    prev_count = count; 
    while (buffer.at(count) != ',') { 
     ++count; 
    } 
    _s3 = _buffer.substr(prev_count, count); 
    prev_count = count; 
    while (buffer.at(count) != ',') { 
     ++count; 
    } 
    _s4 = _buffer.substr(prev_count, count); 
} 

注意これはparse_input_buffer引数に境界エラーのうち、インデックスを妨げるものではないこと - あなたは追加のチェックを追加する必要があります&& count < _buffer.size()のようなループのwhileにあります。

1

すべて以下の方法はあなたのケースのために働く:あなたはすべての文字列のため、このようなルーチンを使用することができます

。最後の文字がコンマかどうかを確認します。また

if (var2[var2.size() - 1] == ',') 
    var2.pop_back(); 

、あなたはそれであればカンマを消去することができます:カンマであれば

if (var1[var1.size() - 1] == ',') 
    var1.replace(var1.size() - 1, var1.size() - 1, ""); // (From index, to index, with) 

は、あなたが(pop_back可能)最後の文字:はい場合は、「空らし」に置き換えます最後の文字:

if (var3[var3.size() - 1] == ',') 
    var3.erase(var3.size() - 1, var3.size() - 1); // (From index, to index) 
+0

これは空白を処理しますか? 'INFILE >> var1' @noobgineer – Noobgineer

+0

は、私は、変数の数が異なる場合ので、私は、私はちょうど変数の最大数を宣言し、1行だけの3つの要素を持っていたか、別の1の5つの要素を持って言うことができますどのようなデフォルト –

+0

でスペースは無視されますvar5が何も読んでいないことを心配する必要はありませんか? – Noobgineer

関連する問題