2016-12-03 153 views
0

Iam嘗試將包含整數的文本文件讀取到整數數組中。 如果輸入是:1 3 4 5 6 (中間有空格)它工作正常。將逗號分隔的文件讀取到整數數組中

但是,如果輸入是:1,3,4,5,6(逗號分隔)。它只是打印1.(第一位數字)。如果程序發現1,3,4,5,6作爲單個實體那麼它應該打印 1,3,4,5,6作爲第一個索引ryt? 而且File >> x,這個表達式是否通過檢測兩者之間的空間來逐個獲取值?

#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

其最有可能的是,當你輸入一個用逗號入文件時,它讀取它作爲一個整體的字符串。確保這些逗號也是逗號分隔符,我不知道你會在這個代碼中放置逗號,但是你仍然需要一個分隔符。

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

您是否嘗試過使用sscanf和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

請更新爲什麼這是downvoted? – 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,3,4,5,6作爲一個單獨的實體,那麼它應該打印1,3,4,5,6作爲第一個索引ryt?

由於您試圖將「1,3,4,5,6」讀入int對象,因此它僅打印「1」。然而,int不能是「1,3,4,5,6」。顯然,只要到達第一個「壞」字符即逗號就停止解析,並且最終得到迄今爲止建立的整數,即「1」。

輸入的其餘部分被丟棄。就好像您的線路是「1abcdef」或「1abcdef2345」。

而且File >> x,這個表達式是否通過 一個一個地檢測值?

是的,這使得它非常不靈活。

我推薦使用std::getline代替operator>>,而不是用','作爲分隔符。雖然函數的名稱不再有意義,因爲它不再讀取(因爲它使用默認分隔符'\n'),它將工作得很好。

您將以個人std::string結尾,容易使用std::stoi轉換爲int s。

當你在它的時候,擺脫原始int arr[100]並使其成爲std::vector<int>,以便你不限於100個元素。無論如何,100是一個醜陋的魔法(任意)數字。

下面是一個例子:正如你所看到的,我也採取了提出一些其他優秀的C++的做法,如避免using namespace stdstd::endl機會

#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"; 
    } 
} 

相關問題