2015-03-02 79 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; 
    } 
}