!急问高手C++中,如何完全读入此文本内容,并建立完整的互相联系的class。读完完成多参量复制赋值

shzbzm 2009-07-08 03:15:12
!急问高手C++中,如何完全读入此文本内容,并建立完整的互相联系的正确class。读完后再多参量复制赋值


急问高手C++中如何完全读入下列文本文件内容,并完全建立各个class, 和架构记录好各个calss之间的联系, 读完之后再给class中间的多个参量复制值进去。

下面我问的只是一个程序中碰到的初始化问题,希望版主不要锁我的帖子,谢谢。 例子也是为了提问的小例子。
虽然我说的很多,只是程序的一个初始步骤,不知道在c++中怎么样作比较好,所以提问。不是广告。
请不要锁帖。谢谢。


这个文本代表的是 一个物理上面的电路。其中有45个元件互相间连线组成这个电路。
每行的物理意义如下:
比如
U35 = NAND(U68, U67, U66, U65) 等号左右各有一个空格。
等号左边代表的是电路中某个元件 的 输出端的 记号标志 比如U35。 等号右边的“ ( ” 左边的代表这个原件的类型,比如
NAND 类型。 括号中的U68, U67, U66, U65 代表 这个 元件的输入端口有4个分别从 输出端的记号标志为U68, U67, U66, U65
分别连接过来的。“)”代表本元件描述完毕。

请大家注意乍一看好像每个元件只有一个输出端。但是实际上想想看, 由于每个输出端可以连到多个元件输入端。
实际上每个元件的输出端连接到的别的元件的输入端的个数是不固定的。 即下列文本已经给出了每个元件的输入端的个数。
但是每个元件输出端所连接的个数是不固定的。
比如某个 Nand 元件的实际输出端连接数可以是3个,4个或多个,也可能只有一个。
OVERFLW_REG = DFF(U34)
STATO_REG_2_ = DFF(U45)
STATO_REG_1_ = DFF(U36)
STATO_REG_0_ = DFF(U35)
OUTP_REG = DFF(U44)

U34 = AND(STATO_REG_1_, U38, STATO_REG_0_)
U35 = NAND(U68, U67, U66, U65)
U36 = NAND(U57, U55, U56)
U37 = OR(LINE2, LINE1)
U38 = NOT(STATO_REG_2_)
U39 = NOT(STATO_REG_1_)
U40 = NOT(LINE2)
U41 = NOT(LINE1)
U42 = NOT(STATO_REG_0_)
U43 = NAND(STATO_REG_1_, U42)
U44 = NAND(U73, U72)
U45 = NAND(U60, U59)
U46 = NAND(U70, U69)
U47 = NAND(LINE1, LINE2)
U48 = NAND(STATO_REG_2_, U43)
U49 = NOT(U37)
U50 = NAND(U49, U42)
U51 = NOT(U47)
U52 = NOT(U43)
U53 = NAND(U47, U43)
U54 = NAND(STATO_REG_2_, U47)
U55 = NAND(STATO_REG_0_, U39, U47)
U56 = NAND(U52, U54)
U57 = NAND(U62, U61, STATO_REG_2_)
U58 = NOT(U48)
U59 = NAND(U53, U38)
U60 = NAND(U50, U39, STATO_REG_2_)
U61 = NAND(STATO_REG_1_, U49)
U62 = NAND(U37, U42)
U63 = NAND(STATO_REG_0_, U47)
U64 = NAND(U51, U42)
U65 = NAND(U64, U63, U39, U38)
U66 = NAND(U43, U37, STATO_REG_2_)
U67 = NAND(U34, U47)
U68 = NAND(U51, U52)
U69 = NAND(LINE1, U40)
U70 = NAND(LINE2, U41)
U71 = NOT(U46)
U72 = NAND(U58, U71)
U73 = NAND(U46, U48)
每一种类型的元件, 自己本身又有, 电阻, 电容 和 误差参量 3个值要予以赋值初始化。

那么想请问大家,
问题:
在C++中 怎么样从一个文本文件中完整读入上述内容并建立记录起各个互相联系的class, 没有遗漏。 每个元件都是一个单独的class。
即怎样读入, 并为每个元件就是每句话建立一个clas, 并完全建立他们之间的联系。

举个例子:
U35 = NAND(U68, U67, U66, U65)
每个class 要有名字,所以这个class.name 就是U35
其中class的内容要包括 当前元件的输入端 从哪几个元件连接过来 U68, U67, U66, U65,程序算出 输入端的个数, 4个。
这里大家看是不是用数组记录, 比如class.inputname[4]; class.inputno=4. 这些都是程序读取过程中完成。
那么这里的话是用char 来记录个个名字 U68, U67 还是用string或其他的类型呢?
同时与相应的输入class 建立固定的联系。方便以后做各种处理。 当前元件输出端连接到哪些元件, 那么这里是记录对应远见的名字还是地址比较好呢?

然后还要记录,每个元件的输出端连接到哪些元件的输入端, 这里就要在读文件的过程中一个个添加。并记录个数,并不是读了当前句就结束了。 要文件全部读完了才知道 元件的输出端到底连到了哪些输入端。有几个。
这里大家看是不是用数组记录输出端的名字和个数, 比如 class.outputname[]; calss.outputno.
大家看这些个 class.inputname 和class.outputname 数组是用什么类型好呢? 是仅仅记录char 或者string的名字还是 实际上对应数组的指针地址呢?
因为要建立好他们的动态连接方便以后处理问题。

然后每个class 中间还要有 电阻, 电容 ,误差参量等等其他多个参量的位置。 比如说 class.r , class.c, class.f.
文件读取完,互相的联系结构建立好后就要根据各个class的不同类型进行赋值。比如class.typ=NAND; class.typ=NOT.

总而言之就是想问大家,
1,c++中应该怎么样正确的读入这个文件并建立起正确的class 和各个class之间的联系。 请注意每个元件 都可能有多个输入端和多个输出端。 输入端和个数是当前句读完就知道,但是输出端是谁和其个数确是要整个文件读完了之后才能完全知道。

最重要的是我想请问c++中应该用什么命令来正确的读入这个文件的完整内容, 分析然后建立结构。
应该是一个字母一个字母的逐个读入并且逐个分析才对吧。
请给一下这个读文件过程 和 建立完整结构和联系的代码。

2
这个class的成员各个类型使用什么比较好呢?
由于以后也要不停的调用每个class的内容并对他们进行处理, 所以类型要方便处理。
希望能写出各个类型的code。
c++中是不是要先写个 abstract class 呢?
希望能写出个完整的class 看下。

3, 然后就是初始化,文件读完之后,要根据各个class 的不同类型如NAND 和 NOT 进行赋值。
所以这个 class.typ应该用什么类型记录呢?方便根据class 读入的不同类型来进行赋值。 然后由于读取完了之后每个class 都是多参量来进行赋值。即已经有各个类型的多个标准值。要把它们全部复制到 每个元件的类型中来。
那么有什么好的初始化多参量复制语句呢?
希望能详细写出 初始化多参量的赋值复制语句。

4,请问这个每读一行建立一个新的class 的语句应该怎么写呢?new 吗?
又用什么来记录所有的class呢? vector 吗?希望能给出代码。

5,由于有的文件的输出端和输入端也可能全部用数字表示,如果全部是数字表示的话,程序代码要做修改吗?
class的各个成员类型还是一样吗?
比如文本文件的格式也可能如此 23 = OR(13,17,20) 或者是没有等号直接 23 OR(13,17,20) 中间有3个空格

6,上面给的是一个实际的完整的文本文件。大家可以试着跑一下,看是不是可以正确读入。 然后如果说这个文本文件的行数有几百万的话,就是几百万个元件的话,在c++中是不是还是应该这样来读这个文件, 是不是还是这样建立class以及各个class之间的完整联系。 class中各个成员的类型是不是还是这样定呢?
希望能给出扩展性强能适合处理包含几百万个元件的文本的代码。


我最想明白的就是c++中如何一个一个字母的把文件读进来并且分析建立互相联系的class结构。

谢谢大家的帮助。急等高手指教。 非常感谢。

...全文
417 59 打赏 收藏 转发到动态 举报
写回复
用AI写文章
59 条回复
切换为时间正序
请发表友善的回复…
发表回复
shzbzm 2009-07-25
  • 打赏
  • 举报
回复
有flex和bison 相关软件和资料的下载地址马?
lhslktg 2009-07-25
  • 打赏
  • 举报
回复
[Quote=引用 56 楼 qingcairousi 的回复:]
引用 55 楼 shzbzm 的回复:
请问 flex 和 bison 可以在c++ 里面用吗?
因为我后面还有很多数据处理和运算在c++ 中进行。
您这里说的BNF 应该是指的语言描述规范吧?

semantic action 是什么意思? 如何用呢?


请问大家这个代码:

Element* CircuitDB::findElementById(const std::string& id) {
for (size_t i = 0; i  < elements.size(); ++i) {
if (elements[i]->getId() == id) {
return elements[i];
}
}

return new Element(id);
}

请问大家这个 return new Element(id);
既然通过id没有找到,为什么要 return new Element(id)
是会产生什么效果? 什么作用呢?
谢谢


flex和bison就是词法分析器和语法分析器生成器。其中flex使用正则表达式来描述词法规则,bison用BNF来描述语法规则。这两个软件可以各自输入词法规则(.文件)和语法规则文件(.y文件),然后生成c/c++源代码。


所谓的semantic action指的是当正则表达式或BNF与输入匹配时所执行的操作。

比如,在flex的.l文件中有这么一段:
[a-zA-Z][a-zA-Z0-9]* {printf("matched!");}
前半部分是一个正则表达式,flex生成的词法分析器会拿着这个正则表达式来依次匹配你的输入。如果成功匹配,则后半部分花括号里面的printf("matched");将会被执行。这个花括号里面的内容就叫semantic action。
在bison里面也有类似的方法。具体的使用你可以参考这两个软件的使用手册,不算复杂。
[/Quote]
请问可否给个这两个软件的使用手册的下载地址。
快速入门的 书有哪些? 可否给个下载地址。
再给个介绍的专业网站吧

非常感谢。
qingcairousi 2009-07-25
  • 打赏
  • 举报
回复
http://flex.sourceforge.net/
http://www.gnu.org/software/bison/
最好的资料就是这两个软件的使用手册
shzbzm 2009-07-24
  • 打赏
  • 举报
回复
Element* CircuitDB::findElementById(const std::string& id) {
for (size_t i = 0; i < elements.size(); ++i) {
if (elements[i]->getId() == id) {
return elements[i];
}
}

return new Element(id);
}

请问大家这个 return new Element(id);
是会产生什么效果? 什么作用呢?
谢谢
qingcairousi 2009-07-24
  • 打赏
  • 举报
回复
这种场合用flex+bison是相当合适的,你的文件用BNF大致可以这么描述:
elements : element|
element elements;
element : name '=' definition;
definition : name '(' inputs')';
inputs : input|
input inputs;
element:TEXT;
name:TEXT;
input:TEXT;

然后剩下的就在semantic action里面填代码了。你的需求其实只需要懂一点简单的编译原理就很容易实现了。
qingcairousi 2009-07-24
  • 打赏
  • 举报
回复
[Quote=引用 55 楼 shzbzm 的回复:]
请问 flex 和 bison 可以在c++ 里面用吗?
因为我后面还有很多数据处理和运算在c++ 中进行。
您这里说的BNF 应该是指的语言描述规范吧?

semantic action 是什么意思? 如何用呢?


请问大家这个代码:

Element* CircuitDB::findElementById(const std::string& id) {
for (size_t i = 0; i < elements.size(); ++i) {
if (elements[i]->getId() == id) {
return elements[i];
}
}

return new Element(id);
}

请问大家这个 return new Element(id);
既然通过id没有找到,为什么要 return new Element(id)
是会产生什么效果? 什么作用呢?
谢谢

[/Quote]
flex和bison就是词法分析器和语法分析器生成器。其中flex使用正则表达式来描述词法规则,bison用BNF来描述语法规则。这两个软件可以各自输入词法规则(.文件)和语法规则文件(.y文件),然后生成c/c++源代码。


所谓的semantic action指的是当正则表达式或BNF与输入匹配时所执行的操作。

比如,在flex的.l文件中有这么一段:
[a-zA-Z][a-zA-Z0-9]* {printf("matched!");}
前半部分是一个正则表达式,flex生成的词法分析器会拿着这个正则表达式来依次匹配你的输入。如果成功匹配,则后半部分花括号里面的printf("matched");将会被执行。这个花括号里面的内容就叫semantic action。
在bison里面也有类似的方法。具体的使用你可以参考这两个软件的使用手册,不算复杂。
shzbzm 2009-07-24
  • 打赏
  • 举报
回复
请问 flex 和 bison 可以在c++ 里面用吗?
因为我后面还有很多数据处理和运算在c++ 中进行。
您这里说的BNF 应该是指的语言描述规范吧?

semantic action 是什么意思? 如何用呢?


请问大家这个代码:

Element* CircuitDB::findElementById(const std::string& id) {
for (size_t i = 0; i < elements.size(); ++i) {
if (elements[i]->getId() == id) {
return elements[i];
}
}

return new Element(id);
}

请问大家这个 return new Element(id);
既然通过id没有找到,为什么要 return new Element(id)
是会产生什么效果? 什么作用呢?
谢谢


shzbzm 2009-07-15
  • 打赏
  • 举报
回复
c++的
shzbzm 2009-07-15
  • 打赏
  • 举报
回复
请问可否给个可以运行的代码看下 结果如何?
谢谢了
snowy_sakura 2009-07-15
  • 打赏
  • 举报
回复
看完楼主的问题 其实感觉用c/c++都可以实现的
每一条记录读入后建立一个节点,然后就是建立一个十字链表的问题了。
建立了十字链表再初始化每个对象不可以吗?那样就简单多了~
shzbzm 2009-07-14
  • 打赏
  • 举报
回复
请问假如每个元件里面有4个成员,分别叫 r,c,f, beita
可否帮忙写两个函数 分别对应处理从别的地方复制成员到这个里面的任意一个元件的情形,
两个函数分别对应别的地方的复制源 是相似的 object 和 class 的时候的两种情形。
比如分别复制 object对象到U70和 复制class对象到 U45 元件里面去。
不知道能不能实现呢?

非常感谢
shzbzm 2009-07-13
  • 打赏
  • 举报
回复
[Quote=引用 47 楼 shzbzm 的回复:]
我看到了,
请问假如每个元件里面有4个成员,分别叫 r,c,f, beita
那么我要在上面的读完文件后给他们赋值。 这个有没有快速的语法,或者说能够一句话把值从另一个地方复制过去,而不用写成4句话。
请问有没有这样的语法,可否 写出来,给一下注释说明,谢谢
[/Quote]
还有这个另一个地方是否也要写成 一样格式的 object呢? 如果是的话,最起码要什么格式? class 行不行呢?
可否分别给出 复制源是 object 和 class 的时候的 语法代码说明。 谢谢
shzbzm 2009-07-13
  • 打赏
  • 举报
回复
我看到了,
请问假如每个元件里面有4个成员,分别叫 r,c,f, beita
那么我要在上面的读完文件后给他们赋值。 这个有没有快速的语法,或者说能够一句话把值从另一个地方复制过去,而不用写成4句话。
请问有没有这样的语法,可否 写出来,给一下注释说明,谢谢
athzhang 2009-07-13
  • 打赏
  • 举报
回复
athzhang 2009-07-13
  • 打赏
  • 举报
回复
[Quote=引用 43 楼 hiboys 的回复:]
用mfc吧, <= 10行代码搞定
[/Quote]
愿问其详
athzhang 2009-07-13
  • 打赏
  • 举报
回复
[Quote=引用 42 楼 shzbzm 的回复:]
U69's NO.1 input id is .
's type is UNKNOWN.
's Input is connected to the following elements with id: None
's Input's number is 0.
's Output is connected to the following elements with id: None
's Output鈥榮 number is 0.
's resistance is -8.58993e+008./// 为什么值会出错?
's capacitance is -8.58993e+008.
's tolorance is -8.58993e+008.
[/Quote]
这个是空对象的输出信息,应该是 LINE1和LINE2两个元件,因为在文件中无法读到其具体信息,所以没有在vector中储存。(在新版中做了调整)

在CircuitDB中增加了两个map,分别是:
每个元件的输入端对象指针的集合(key:id; value:id对应的input Element*)
每个元件的输出端对象指针的集合(key:id; value:id对应的output Element*)


我想问下,如果我要调用某个id u34的r,c,f值然后同时赋值给他们应该用什么命令?
-->利用CircuitDB中的 Element* findElementById(const std::string& id);函数找到你要的对象,再对更改

如果我要给每个元件新增加成员又该如何做? 比如每个元件增加一个叫 beita的成员的话语法是如何?要在什么地方修改呢?
-->在Element类中添加新成员,并加上配套的getter和setter
public:
double getBeita() const;
void setBeita(const double& beita_);

private:
double beita;


代码我更新了,把原先的vector和map中存放对象改为对象的指针,对象都储存在堆内存中。
你再下载一次,注意文件名:elec-v3.tar.bz2
hiboys 2009-07-13
  • 打赏
  • 举报
回复
用mfc吧,<= 10行代码搞定
shzbzm 2009-07-13
  • 打赏
  • 举报
回复
ouputs: 基本达成了初始化
下面有错误:

The NO.41 element's id is U69
U69's type is NAND.
U69's Input is connected to the following elements with id: U40 ///U69 = NAND(LINE1, U40)还有一个没有显示
U69's Input's number is 2.
U69's Output is connected to the following elements with id: U46
U69's Output鈥榮 number is 1.// 鈥榮 是怎么来的?
U69's resistance is 0.
U69's capacitance is 0.
U69's tolorance is 0.

So now let us test whether the connection are fully built:

U69's NO.1 input id is .
's type is UNKNOWN.
's Input is connected to the following elements with id: None
's Input's number is 0.
's Output is connected to the following elements with id: None
's Output鈥榮 number is 0.
's resistance is -8.58993e+008./// 为什么值会出错?
's capacitance is -8.58993e+008.
's tolorance is -8.58993e+008.

U69's NO.2 input id is U40.
U40's type is NOT.
U40's Input is connected to the following elements with id://id没显示 U40 = NOT(LINE2)
U40's Input's number is 1.
U40's Output is connected to the following elements with id: U69
U40's Output鈥榮 number is 1.
U40's resistance is 0.
U40's capacitance is 0.
U40's tolorance is 0.

The input test for id U69 is finished.

U69's NO.1 output id is U46.
U46's type is NAND.
U46's Input is connected to the following elements with id: U70 U69
U46's Input's number is 2.
U46's Output is connected to the following elements with id: U71 U73
U46's Output鈥榮 number is 2.
U46's resistance is 0.
U46's capacitance is 0.
U46's tolorance is 0.

The output test for id U69 is finished.

-------------------------------------------------

The NO.42 element's id is U70
U70's type is NAND.
U70's Input is connected to the following elements with id: U41
U70's Input's number is 2.
U70's Output is connected to the following elements with id: U46
U70's Output鈥榮 number is 1.
U70's resistance is 0.
U70's capacitance is 0.
U70's tolorance is 0.

So now let us test whether the connection are fully built:

U70's NO.1 input id is .
's type is UNKNOWN.
's Input is connected to the following elements with id: None
's Input's number is 0.
's Output is connected to the following elements with id: None
's Output鈥榮 number is 0.
's resistance is -8.58993e+008.
's capacitance is -8.58993e+008.
's tolorance is -8.58993e+008.

U70's NO.2 input id is U41.
U41's type is NOT.
U41's Input is connected to the following elements with id:
U41's Input's number is 1.
U41's Output is connected to the following elements with id: U70
U41's Output鈥榮 number is 1.
U41's resistance is 0.
U41's capacitance is 0.
U41's tolorance is 0.

The input test for id U70 is finished.

U70's NO.1 output id is U46.
U46's type is NAND.
U46's Input is connected to the following elements with id: U70 U69
U46's Input's number is 2.
U46's Output is connected to the following elements with id: U71 U73
U46's Output鈥榮 number is 2.
U46's resistance is 0.
U46's capacitance is 0.
U46's tolorance is 0.

The output test for id U70 is finished.


我想问下,如果我要调用某个id u34的r,c,f值然后同时赋值给他们应该用什么命令?
首先程序应该如何找到u34呢?然后再赋值给其成员。 语法是什么呢?

如果我要给每个元件新增加成员又该如何做? 比如每个元件增加一个叫 beita的成员的话语法是如何?要在什么地方修改呢?

非常感谢

ysysbaobei 2009-07-13
  • 打赏
  • 举报
回复
顶下
shzbzm 2009-07-13
  • 打赏
  • 举报
回复
你那边要注册,我就不去了。
我想问下,如果我要调用某个id u34的r,c,f值然后同时赋值给他们应该用什么命令?
首先程序应该如何找到u34呢?然后再赋值


我一直说的就是,你没有建立和找到outputsid的集合,并把它们对应的存储起来。看来这个没有电路知识可能不理解。 这个和inputids是一样的。只不过要更多的分析提取然后建立。
谢谢
加载更多回复(39)

64,663

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧