2016-12-03 8 views
0

整数を含むテキストファイルを整数配列に読み込もうとしています。 入力が次の場合:1 3 4 5 6 (間にスペースを入れてください)正常に動作しています。コンマ区切りファイルを整数配列に読み込む

入力が:1,3,4,5,6(カンマ区切り).1だけを印刷します(最初の数字)。プログラムが1,3,4,5,6を単一のものとして検出した場合エンティティの最初のインデックスとして 1,3,4,5,6を印刷する必要がありますか? また、File >> xの間にスペースを検出することで、この式は値を1つずつ取りますか?

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

int main() 
{  
    int n = 0; //n is the number of the integers in the file ==> 12 
    int num; 
    int arr[100]; 
    int x; 
    int sum = 0; 
    ifstream File; 
    File.open("integer.txt"); 
    if(!File.is_open()) 
    { 
     cout<<"It failed"<<endl; 
     return 0; 
    } 

    while(File>>x) 
    { 
     arr[n] = x; 
     n++; 
    } 

    File.close(); 
    cout<<"n : "<<n<<endl; 
    for(int i=0;i<n;i++) 
    { 
     cout << arr[i] << " "; 
    } 
    return 0; 
} 

答えて

0

ファイルにカンマで入力すると、その文字列全体が1つの文字列として読み取られる可能性が最も高くなります。カンマの区切り文字も確かめてください。このコードにカンマを置く場所はわかりませんが、デリミタは必要です。

//example function you can use. 
getline(ss, s, ',') 
-1

ifscanfでifstreamを試したことがありますか?以下の簡単な例

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

    int main() 
    { 
     int n = 0; //n is the number of the integers in the file ==> 12 
     int num; 
     int arr[100]; 
     char line[200]; 
     char *ptr=line; 
     int x=0,count=0; 
     int sum = 0; 
     ifstream File; 
     File.open("integer.txt"); 
     if(!File.is_open()) 
     { 
      cout<<"It failed"<<endl; 
      return 0; 
     } 
     File.getline(line,200); 

     while((count=sscanf(ptr,"%d,",&x))>0) 
     { 
      arr[n] = x; 
      n++; 
      ptr+=count+1; 
     } 
     File.close(); 
     cout<<"n : "<<n<<endl; 
     for(int i=0;i<n;i++) 
     { 
      cout << arr[i] << " "; 
     } 
     cout<<endl; 
     return 0; 
    } 
+0

ptr + = count + 1はデリミタをスキップすることです – KingOfWigs

+0

なぜこれをダウンリストに追加してください? – KingOfWigs

+0

OPはCではなくC++を使用しており、 'sscanf'は危険で型が危険です。また、別のマジックナンバー配列 'char line [200]'を追加しました。不必要に複雑なポインタ変数でコードを複雑にし、 'getline'メンバ関数を使用しました。 –

0

ここで起きているのは、最初の文字が抽出された後、コードがコンマを整数として抽出しようとしていることです。それができないので、それはfalseを返し、ループを終了します。

非常によく似た質問hereがあります。

あなたのwhileループは次のようになります。

while(File>>x) 
{ 
    arr[n] = x; 
    n++; 
    if (ss.peek() == ',') 
     ss.ignore(); 
} 
0

をしかし、入力がある場合:1,3,4,5,6(カンマ区切り)はちょうど 1(最初の数字を印刷.Its )。プログラムが1,3,4,5,6を単一のエンティティとして検出した場合、最初のインデックスとして1,3,4,5,6を出力する必要がありますか?

intオブジェクトに「1,3,4,5,6」を読み込もうとしているため、「1」と表示されます。ただし、intは「1,3,4,5,6」にすることはできません。簡単に言えば、最初の「悪い」文字(コンマ)に達するとすぐに解析が停止し、それまでに構築された整数、つまり「1」で終わることになります。

残りの入力は破棄されます。あなたのラインが "1abcdef"か "1abcdef2345"のようです。

また、ファイル>> xの場合、この式は1つずつ の間のスペースを検出することで値を受け取りますか?

はい、それはかなり柔軟性に欠けます。

operator>>を使ってバイティングするのではなく、std::getlineを使用し、区切り文字として','を使用することをお勧めします。関数の名前は、もはや(既定の区切り文字'\n'と同じ)を読み込まないため、もはや意味をなさないが、正常に機能する。

std::stringのオブジェクトは、intに簡単に変換できるオブジェクトは、std::stoiを使用して終了します。

あなたがそれをしている間に生のint arr[100]を取り除き、std::vector<int>にして、100個の要素に限定されないようにします。とにかく、100は醜い魔法(任意の)番号です。あなたが見ることができるように、私はまた、このようなusing namespace stdstd::endlを避けることなど、いくつかの他の良いC++プラクティスを提案する機会を撮影した

#include <iostream> 
#include <sstream> 
#include <string> 
#include <vector> 

int main() 
{ 
    // faking some test file input; behaves like an `std::ifstream`: 
    std::istringstream is("1,2,3,4,5"); 

    std::vector<int> numbers; 

    std::string number_as_string; 
    while (std::getline(is, number_as_string, ',')) 
    { 
     numbers.push_back(std::stoi(number_as_string)); 
    } 

    std::cout << "n : " << numbers.size() << "\n"; 
    for(auto&& number : numbers) 
    { 
     std::cout << number << "\n"; 
    } 
} 

:ここ

は一例です。

関連する問題