2015-03-02 32 views
0

我想從文本文件中讀取整數,並將它們放入一個動態數組中,該數組將表示爲矢量和矩陣的分配。如何將整數從文件讀入動態數組

的從輸入文件中的幾行的一個例子:

3#456 
33#123456789 

磅符號之前的數字表示向量或矩陣的元素,所以3#將意味着一個三個元素向量和33#將意味着3行3列的矩陣。

讀這些並不是一個真正的問題,因爲我們被告知我們可以假設我們知道哪些行是矩陣,哪些是向量,但是,我從來沒有使用C++文件I/O,所以我不知道如何遍歷數字4,5,6並將它們放入一個3,9,12等元素動態創建的數組中。以下是我正在使用的一些示例。

int *a; 
int size_a; 
char x; 

ifstream infile("input.txt"); 

if (infile.is_open()) 
{ 
    infile >> size_a; 

    // The x is basically a junk variable used to go past the '#' 
    // when reading the file 
    infile >> x; 

    a = new int[size_a]; 
} 

之後,我沒有真正意識到如何循環直到行的末尾,並將其餘元素放在數組中。例如,在這一行中,數字4,5和6需要放入數組中,然後從添加元素中斷開,然後轉到下一行以處理下一個數組,這我不知道如何做任一。有任何想法嗎?

+1

...你沒有使用動態數組。你想'std :: vector' – 2015-03-02 05:08:29

+2

不需要向量; 'new'賦予op創建數組的能力,這些數組的大小在運行時不是已知的,而是編譯時間。你說得對,這些並不是動態調整大小的數組,但它們確實符合OP的要求,不包括調整大小 - 只是不知道先驗大小。 – EyasSH 2015-03-02 05:15:31

+0

你需要將每個數字流轉換成一個'char'變量(比如說''c'''),然後你可以使用表達式'c - '0''將它從ASCII轉換爲數字。使用這些數字來獲取正確的'size_a'等值,以及要寫入數組/矩陣的元素值。 – 2015-03-02 05:23:18

回答

2

下面的代碼會爲你做這個。請注意,您不需要在這裏使用new - 您應該只使用std :: vector。在這種情況下,「#」之前的數字不需要,因爲在創建數組時不需要指定數組的大小。

由於這個原因,我在這裏用new來告訴你如何閱讀文件的兩個部分。

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

int main() 
{ 
    std::ifstream file("input.txt"); 

    if(file.good()) { 
     std::string line; 
     std::getline(file, line); 
     std::string::size_type pos = line.find('#'); 
     std::string strSize = line.substr(0, pos); 
     std::string strValues = line.substr(pos + 1); 
     int size = 0; 

     for(char c : strSize) { 
      if(size == 0) 
       size = static_cast<int>(c - '0'); 
      else 
       size *= static_cast<int>(c - '0'); 
     } 

     int* values = new int[size]; 

     for(int i = 0; i < size; ++i) { 
      values[i] = static_cast<int>(strValues[i] - '0'); 
     } 

     std::cout << "Array of size " << size << " has the following values:" << std::endl; 

     for(int i = 0; i < size; ++i) { 
      std::cout << values[i] << std::endl; 
     } 

     delete[] values; 
    } 
}