2017-10-17 1 views
0

でファイルを読み込んで改行文字を省略します:が、私はこのコードを持っているC++

#include <iostream> 
#include <string> 
#include <fstream> 

int main() 
{ 
    std::ifstream path("test"); 
    std::string separator(" "); 
    std::string line; 
    while (getline(path, line, *separator.c_str())) { 
     if (!line.empty() && *line.c_str() != '\n') { 
      std::cout << line << std::endl; 
     } 

     line.clear(); 
    } 

    return 0; 
} 

ファイル「テスト」は、スペースの様々な数で区切られ、数字が入力されます。数字だけを読み、スペースと改行を省略する必要があります。このコードでは、空白は省略して改行文字を省略しています。

これらの入力ファイル「テスト」から数行は以下のとおりです。

 3  19  68  29  29  54  83  53 
    14  53  134  124  66  61  133  49 
    96  188  243  133  46  -81  -156  -85 

私は問題はこの*line.c_str() != '\n'が文字列lineヒット改行文字とプログラムが印刷を続けるかどうかを判断するための適切な方法ではないということだと思います改行!

この1つは素晴らしい作品:

#include <iostream> 
#include <string> 
#include <fstream> 

int main() 
{ 
    std::ifstream path("test"); 
    std::string separator(" "); 
    std::string line; 
    while (getline(path, line, *separator.c_str())) { 
     std::string number; 
     path >> number; 
     std::cout << number << std::endl; 
    } 

    return 0; 
} 
+0

'* line.c_str()=「\あなたはおそらくn''チェックする必要があります:私たちは、その後、各ラインから整数を読み、その後stringstreamに各行を変換し、行毎にファイルを読み込みますその行に空白だけが含まれていないことを確認します。入力の例を見ずに言うのは難しいです( ''\ n' '文字の位置がわかるようにしてください)。 – user0042

+1

最初の文字が改行であるかどうかだけを確認しています。数字が行の最後にある場合、改行は最初の文字ではなく 'line'の最後の文字になります。 – Barmar

+2

'path >> number;'を使用して、空白をスキップして単一の番号を読むのはなぜですか? – Barmar

答えて

1

は整数を読み取るためのストリーム演算子>>を使用します。

std::ifstream path("test"); 
int number; 
while(path >> number) 
    std::cout << number << ", "; 
std::cout << "END\n"; 
return 0; 

これは、それらがスペースで区切られ仮定して、ファイル内のすべての整数を一覧表示されます。

getlineの正しい使用法は、getline(path, line)またはgetline(path, line, ' ')です。ここで、最後の引数には任意の文字を使用できます。

*separator.c_str()この場合、' 'に変換されます。この使用法はお勧めしません。

同様に*line.c_str()は、lineの最初の文字を指します。 lineが最後\nの文字を含めないであろう、getline(path, line)を使用する場合は、最後の文字が

if (line.size()) 
    cout << line[size()-1] << "\n"; 

使用見つけるには。

getlineの別の例を示します。 !

は代わりの
#include <iostream> 
#include <string> 
#include <fstream> 
#include <sstream> 

int main() 
{ 
    std::ifstream path("test"); 
    std::string line; 
    while(getline(path, line)) 
    { 
     std::stringstream ss(line); 
     int number; 
     while(ss >> number) 
      std::cout << number << ", "; 
     std::cout << "End of line\n"; 
    } 
    std::cout << "\n"; 
    return 0; 
} 
1

はC++に組み込まれてisdigit関数を使用します。

+0

この機能は記号を考慮に入れますか? – Pekov

+0

いいえ、あなたはいつもテストを行うことができますが、isdigitは非数字だけをフィルタリングします。 – Lavevel

関連する問題