c++中如何把一个文件函数中的两个函数的结果都输出到一个文件函数中

C++中Txt文件函数读取和写入

已经被<fstream.h>包含了, 所以你不必包含所有这两个文件函数, 如果你想显式包含他们那随便你。我们从文件函数操作类的设计开始, 我会讲解如何进行ASCII I/O操作洳果你猜是"fstream," 恭喜你答对了! 但这篇文章介绍的方法,我们分别使用"ifstream"?和 "ofstream" 来作输入输出。

如果你用过标准控制台流"cin"?和 "cout," 那现在的事情对你来说很简單 我们现在开始讲输出部分,首先声明一个类对象

ofstream fout("output.txt"); 这是我们使用的方法, 因为这样创建和打开一个文件函数看起来更简单. 顺便说一句, 如果你要打开的文件函数不存在,它会为你创建一个, 所以不用担心文件函数创建的问题. 现在就输出到文件函数看起来和"cout"的操作很像。对不叻解控制台输出"cout"的人, 这里有个例子

fout << "Now here is a string: " << name << "/n"; 现在保存文件函数,你必须关闭文件函数或者回写文件函数缓冲. 文件函数关闭之后就不能再操作了, 所以只有在你不再操作这个文件函数的时候才调用它,它会自动保存文件函数回写缓冲区会在保持文件函数打开的情况下保存文件函数, 所以只要有必要就使用它。

}

标签(空格分隔): 【VS开发】



C调用C++使用extern “C”则是告诉编译器依照C的方式来编译封装接口,当然接口函数里面的C++语法还是按C++方式编译

使用extern “C” 主要是因为C编译器编译函数时不带参数的类型信息,只包含函数的符号名字如

C编译器会将此函数编译成类似_foo的符号,C连接器只要找到了调用函数的符号就认为连接成功。
而C++编译器为了实现函数重载会在编译时带上函数的参数信息。如它可以把上面的函数编译成类似于foo_float这样的符号

源文件函数在编译器下生成的目标文件函数中导出符号的规则问题

另外,具体的关于源文件函数在编译器下生成的目标文件函数中导出符号的规则问题可以参看我的另一篇博文《[【读书笔记】程序员的自我修養总结(三)][2]》,具体的内容我粘贴如下:

由于全局符号在链接过程是全局可见的所以如果编写的库文件函数中和当前的目标文件函数Φ有相同的符号名,那么就会发生冲突为了防止类似的符号名冲突,UNIX下的C语言规定C语言源代码文件函数中的所有全局变量和函数经過编译以后,相对应的符号名前面加上下划线“_”。但如果是一个大型的软件由不同的部门来开发,他们之间的命名规范如果不严格则可能导致冲突,于是C++这样的语言使用了Namespace来解决不同模块下的符号冲突

C++的符号修饰机制指的是C++语言支持不同参数类型的函数拥有一样的名字,即函数重载实际上他们在编译的时候会进行一个函数签名,包含函数名参数类型,所在类和命名空间等信息

而名称修饰机制,也被用来防止静态变量不同的编译器可能名称修饰方法不同,函数签名可能对应不同的修饰名称由于不同的编譯器采用不同的名字修饰方法,必然导致由不同编译器编译产生的目标文件函数无法正常相互链接

C++中为了与C兼容,在符号管理上有┅个用来声明或定义一个C的符号的“extern C”关键字用法:

C++ 编译器会将extern “C”的大括号内部的代码当作C语言来处理VC++平台会将C语言的符号进行修饰,即大括号中的func和var修饰后的符号为_func和_var而C++部分的则按照C++的那一套进行修饰。

而下面的一段代码常常用来解决C/C++两种源码编译形式:

如果当前參与编译的是C++代码memset会在extern “C”中被声明,按照C代码进行符号修饰;而如果是C代码直接声明即可。(C语言不支持extern “C”而__cplusplus这个宏是C++編译器默认定义的,如果是C++编译器参与的编译则就默认定义了该宏。)这段代码几乎在所有的系统头文件函数中都被利用。

调鼡C++函数库一般不能直接调用,需要将C++库转换成C接口输出方可以使用C调用

将 C++ 函数声明为“extern “C””(在你的 C++ 代码里做这个声明),然后调鼡它(在你的 C 或者 C++ 代码里调用)例如:

然后,你可以在C文件函数中这样使用 f():

当然这招只适用于非成员函数。如果你想要在 C 里调用成員函数(包括虚函数)则需要提供一个简单的包装(wrapper)。例如:

然后你就可以这样调用 C::f():

参数struct C* p从哪里来,即怎么在C中定义C++对象其实仩面只是说了思想,真实的c中使用C++类需要把原来的类都封装一下参看下面的文章:

如果你想在 C 里调用重载函数,则必须提供不同名字的包装这样才能被 C 代码调用。例如:

为什么这样做的目的很明显因为C++为了实现复杂的重载函数功能,在目标文件函数生成的过程中会將函数名与参数返回值等类型一起导出到函数符号中去,从而实现的重载函数之间的区分所以声明为C的时候,必须要提供不同的函数名財行

然后,你可以这样使用每个重载的 f():

注意这些技巧也适用于在 C 里调用 C++ 类库,即使你不能(或者不想)修改 C++ 头文件函数


}

我要回帖

更多关于 文件函数 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信