作者khoguan (Khoguan Phuann)
看板C_and_CPP
标题Re: [问题] 请教C++读档&动态阵列的问题
时间Thu Sep 1 01:58:57 2005
※ 引述《sinclair ( )》之铭言:
: ※ 引述《sinclair ( )》之铭言:
: : 最近刚开始接触程式,觉得很有趣,但对C++的指令还很生疏,
: : 想请教大家一个问题。假设我需要读取一个.txt档, 档案的内容如下:
: : NET n1 { c12 c78 }NET n2 { c190 c57 c76 c80 }NET n3 { c191 c59 }
: : 以上只是其中一小部份, 在读完整个档案之前,并不知道有多少个Net与cell
: : 我希望能用一个阵列Data[number of Net][number of cell]来记录档案的资料,
: : 我的想法是每次读取一行字串,如"NET n1 { c12 c78 }", 当发现"Net n"就把紧跟
: : 在後面的数字纪录下来,得到'1',当发现c就记录後面的数字,得到12与78。在读取完
: : 一个字串後将Data[0][11],Data[0][77]的内容纪录为1, 读取完第二个字串时
: : 纪录Data[1][189],Data[1][189],Data[1][56],Data[1][75],Data[1][79]为1,
: : 以此类推...
是不是要做出一个 matrix,里头的格子大部份都是 0 少部份是 1?
: 关於读档的问题,我已经写出来了,附上程式码如下,
: 但现在碰到一个问题。在还没读档之前,
: 我不知道 Data[][]的阵列大小要设定多少,
: 就先宣告为Data[5000][5000], 请问能不能教我
: 如何用动态阵列或任何其他方法,在完成读档的动作後
: 使阵列大小刚好等於net(最大值)乘cell(最大值)
很坚持要用原始的 array 吗?还是可以接受 std::vector 呢?
用 vector<vector<int> > 会好写一点。用原始的 array 就要
先用 alloc() 函式来分配相当大、足够大的空间出来,要
malloc() 两次,第一次 malloc() 第一维,第二次 malloc()
第二维。读入的过程,有一个 maxcell 变数在记录最大的 cell
编号,读完以後,就以此编号做为第二维的最大值,另外,所附
的程式中的 net 已经可以记录最大的 net 数,所以第一维已经
没问题了。
最後,就是做缩小阵列的动作,用 realloc() 剁掉多出来的部
份,也是要做两次,一次是针对第一维,一次是针对第二维,
哪个先做都无妨。
至於用 vector<vector<int> > 的话,一开始是宣告成
vector<vector<int> > Data(5000, vecotr<int>(5000));
後面的缩小动作,因为 vector 有现成的 vector::resize()
可用,就方便多了。
: #include <iostream>
: #include <fstream>
: #include <iomanip>
: using namespace std;
: const int num_net=5000;
: const int num_cell=5000;
: int Data[num_net][num_cell];
: void main()
: {
: char buffer=0;
: int temp=0;
: int net=0;
: int cell=0;
: fstream inFile;
: inFile.open("test.in");
: while(!inFile.eof())
: {
: inFile.get(buffer);
: if (buffer=='n')
: {
: do
: {
: inFile.get(buffer);
: if (buffer=='c')
: {
: inFile >> temp;
: cell=temp;
: Data[net][cell-1]=1;
: }
: }while(buffer!='}');
: net++;
: }
: }
: }
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.130.208.168
1F:推 sinclair:谢谢!我大概知道怎麽宣告动态多维阵列了.. 210.58.30.217 09/02
2F:→ sinclair:请问用vector要如何resize呢? 谢谢! 210.58.30.217 09/02