C++文件读写:

// ofstream constructor.
#include <fstream>      // std::ofstreamint main () {std::ofstream ofs ("test.txt", std::ofstream::out); // ofstream::appofs << "lorem ipsum";ofs.close();return 0;
}

转载于:http://www.cplusplus.com/reference/fstream/ofstream/ofstream/

http://blog.csdn.net/youxin2012/article/details/8917302

http://blog.csdn.net/kingstar158/article/details/6859379

类型是程序设计的基础。一些程序设计语言,比如 Smalltalk 和 Python,在运行的时候才检查预计中的对象的类型,想反,C++ 是静态类型(statically typed)语言,在编译时执行类型检查。导致的结果是:

变量和函数在使用前必须先声明 。

每种类型都定义了其存储空间要求和可以在该类型的所有对象上执行的操作。C++ 是 在 C 的基础上扩充得到的,为了和 C 兼容, C++ 在必要时必须能够直接处理硬件,所以 C++ 提供的一组基本内置类型,如int、char等,这些类型与它们在机器硬件上的标示方式紧密相关。(所以,C++ 可以称为 “具有高级语言库的低级语言”)

本文只限于总结 C++ 的内置类型(Built-in Types),不讨论自定义类型 。

基本内置类型


算术类型

C++ 语言自身定义了一组基本类型来表示不同的数据,如整数、浮点数、字母、bool 类型等,这些类型统称为 算术类型(Arithmetic type) 。

size

算术类型的存储空间依机器而定,即用多少二进制位 bit 来表示一个数 。C++ 标准规定了每个算术类型的最小存储空间,但它并不阻止编译器使用更大的存储空间 。事实上,对于 int 类型,几乎所有的编译器使用的存储空间都比所要求的大 。

使用 sizeof() 操作符可以查询对象或类型的大小(以字节为单位),包含头文件

1

#include <limits>

就可以使用 STL 库中的 numeric_limits<T>::max 和 numeric_limits<T>::min 查询各个内置内类类型的最大值和最小值。

下面是 Ubuntu amd64 版本上的结果:

算术类型可以分为两类:表示整数的 整型 和表示浮点数的 浮点型 。

Integral Types

表示整数、字符、布尔值的算术类型合称为 整型(integral types)。

整数的基本表示类型是 int 。int 类型前面可以加两类修饰说明,表示数据位数长短的 short 和 long ;表示有无符号的 signed 和 unsigned 。组合出来的结果就有 4 种:

1
2
3
4

signed short int
unsigned short int
signed long int
unsigned long int

每一种的数据长短和可以表示的范围都不相同。

字符类型有两种:char 和 wchar_t 。char 用来表示 基本字符集 中的字符,wchar_t 用于 扩展字符集 ,比如汉字和日语 。修饰 int 类型有无符号的 signed 和 unsigned 也可以修饰 char 类型 。

C++ Primer (chapter 2) 中写到:

Unlike the other integral types, there are three distinct types for char: plain char, signed char, and unsigned char. Although there are three distinct types, there are only two ways a char can be represented. The char type is respresented using either the signed char or unsigned char version. Which representation is used for char varies by compiler.

为什么会有这么奇怪的事呢?上网搜索了一下,按照自己的理解总结了一下:

signed/unsigned 可以描述的类型有 int 和 char 两种,在 C 的标准里面规定:对于 int 类型,如果没有在类型前显式地声明,默认 int 是 signed 类型,而对于 char 类型,则是 Implementation Defined 。也就是说由编译器在编译的时候决定具体使用哪一种 。而为什么要作出这么奇怪的规定呢?是因为 char 类型本来就是用来表示字符而非数字的, ASCII 码字只使用 7 bit,所以使用 signed/unsigned 对其没有影响,但是如果使用 char 类型来表示一个 8 bit 的数字(有时候空间不够用时不得不这样做,比如嵌入式系统中),为了可移植性,必须写明 signed/unsigned 。所以,如果用来表示字符,则直接使用 char 就行,如果用来表示整数,则声明是signed/unsigned 。

Linux C编程一站式学习:整型 中进一步解释:

编译器可以定义char型是无符号的,也可以定义char型是有符号的,在该编译器所对应的体系结构上哪种实现效率高就可以采用哪种,x86平台的gcc定义char型是有符号的。这也是C标准的Rationale之一: 优先考虑效率,而可移植性尚在其次。 这就要求程序员非常清楚这些规则,如果你要写可移植的代码,就必须清楚哪些写法是不可移植的,应该避免使用。另一方面,写不可移植的代码有时候也是必要的,比如Linux内核代码使用了很多只有gcc支持的语法特性以得到最佳的执行效率,在写这些代码的时候就没打算用别的编译器编译,也就没考虑可移植性的问题。如果要写不可移植的代码,你也必须清楚代码中的哪些部分是不可移植的,以及为什么要这样写。如果不是为了效率,一般来说就没有理由故意编写不可移植的代码。

网上有博客说:

VC 编译器、x86 上的 GCC 都把 char 定义为 signed char,而 arm-linux-gcc 却把 char 定义为 unsigned char 。

于是,编写一个测试小程序就可以知道我们使用的编译器是如何处理的。

源代码:

1
2

char ch1 = -1;
printf("ch1 = %d\n",ch1);

运行结果:

结果说明,gcc 把 char 默认为 signed char 处理。

布尔类型表示 true 和 false 。可以将任何算术类型的值赋给 bool 对象,0 表示 false ,任何非 0 值都表示 true 。

Floating-Point Types

类型 float 表示 单精度浮点数

类型 double 表示 双精度浮点数

类型 long double 表示 扩展精度浮点数

从前面的运行结果可以看出在我的电脑上 float 使用 1 个字(32 bit) 表示,double 使用 2 个字(64 bit) 表示,long double 使用 4 个字(128 bit) 表示 。

C++ Primer (chapter 2):

The float type is usually not precise enough for real programsfloat is guaranteed to offer only 6 significant digits. The double type guarantees at least 10 significant digits, which is sufficient for most calculations.

Determining which floating-point type to use is easier: It is almost always right to use double. The loss of precision implicit in float is significant, whereas the cost of double precision calculations versus single precision is negligible. In fact, on some machines, double precision is faster than single. The precision offered by long double usually is unnecessary and often entails considerable extra run-time cost.

void

void 类型没有对应的值,仅用在有限的一些情况下,通常用作无返回值函数的返回类型。

初始化 Initialize


初始化 & 赋值

首先是初始化的必要性:

在 C++ 中,初始化是一个非常重要的概念,给变量一个初始值几乎总是正确的,但不要求必须这么做。定义变量时,应该给变量赋初始值,除非确定将变量用于其他意图之前会覆盖这个初值。如果不能保证读取变量前重置变量,就应该初始化变量。变量没有初始化是很常见的导致程序崩溃/结果错误的原因,而且有时候很难像 Debug 一样找到这个错误(bug 导致程序一定不对,但是没有初始化的变量的结果是随机的)。所以,良好的习惯是对每个变量都进行初始化 。

其次是初始化和赋值的区别:

初始化 Initialization:创建变量并且给它赋初始值

赋值 Assigment:擦除变量的当前值并用新值代替

C++ 提供两种初始化变量的方法:复制初始化(copy-initialization)和直接初始化(direct-initialization)。复制初始化使用 =,直接初始化使用 () 。

1
2

int ival = 1024;    // copy-initialization
int ival (1024);    // direct-initialization

使用 = 很容易让人把初始化和赋值混淆在一起,但是在 C++ 中这是两种不同的操作,当涉及到类对象时,两种不同的初始化方式的区别是很微妙的。目前先不考虑这点,只需要知道直接初始化语法更灵活而且效率高。

内置类型初始化

当我们定义一个变量却没有初始化时,系统 有可能 会为我们进行隐式的初始化。至于系统是否帮我们隐式初始化变量,以及为变量赋予一个怎样的初始值,这要取决于 该变量的类型 以及我们 在何处定义的该变量 。

这里我们只考虑内置类型的初始化:

内置类型的变量是否自动初始化取决于变量定义的位置。在函数体外(全局范围)定义的变量都初始化为 0,函数体内定义的变量不进行自动初始化 。

算术类型转换


隐式类型转换

当两个操作数类型不同时,C++ 并不是直接把两个数加在一起,而是提供了一组转换规则,以便在执行算术操作之前,将两个数转换为同一数据类型。这些转换规则由编译器自动执行,不需要程序眼介入,有时甚至不需要程序员了解。因此,它们被称为 隐式类型转换 (implicit type conversion) 。

在以下情况会发生隐式类型转换:

  • 混合类型表达式,操作数被转换为相同类型

    1
    2
    3

    int ival;
    double dval;
    ival >= dval;   // ival converted to double
    

  • 用作条件表达式被转化为 bool 型

    1
    2
    3

    int ival;
    if (ival)       // ival converted to bool
    while ( cin)    // cin converted to bool
    

  • 用表达式初始化(赋值)某一变量,表达式被转化为该变量类型

    1
    2
    3

    int ival = 3.14;    // 3.14 converted to int
    int *ip;
    ip = 0;             // the int 0 converted to a null pointer of type int *
    

另外,函数调用时也可能发生隐式类型转化。

算术类型转换

C++ 语言为内置类型提供了一组转化规则,其中最常用的就是算术转化(arithmetic conversion)。算术转化规则定义了一个 类型转换层次,该层次规定了操作数应该按照什么次序转换为表达式中最宽的数据类型。

有两条通用规则:

  1. 为了保留精度,如果有必要,数据总是被提升为较宽的类型

  2. 所有含有小于整形的有序类型的算术表达式在计算之前其类型都会被转换成整型(整型提升 integral promotion)

关于有符号数和无符号数,原则是:

  1. 不同级数据转换,若较宽的类型可以表示所有较窄的类型的数,则直接将较窄的类型提升为较宽的类型,否则,把两个数都转换为无符号的较宽的类型 。

  2. 同级数据转换,unsigned int 和 int ,signed 类型会转换为 unsigned 类型 。

unsigned 操作数的转换依赖于机器中整型的相对大小,所以,这类转换依赖于机器。

举个栗子:

  1. short 类型 与 int 类型 。在我的机器上,short 类型所占用的宽度为半字(2 Byte),int 类型占用的宽度为 1个字(4 Byte)。所有的 unsigned short 的值都包含在 int 之中,所以,unsigned short 转换为 int 。

  2. 下面程序

    1
    2
    3
    4

    unsigned a = 4;
    signed b = -20;
    int c = (a+b > 4) ? 1 : 0;
    cout << "unsigned int b' = " << unsigned(b) << endl;
    

    运行结果为

    1
    2

    unsigned int b' = 4294967276
    c = 1
    

    因为 b = -2 被转化为一个很大的正数 b' = 4294967276


转载于:http://guqian110.github.io/pages/2014/03/31/built_in_types.html

MAC上用命令行打开文件:

在Linux命令行terminal上使用gedit直接就可以打开文本文件

那么在mac上面如何操作呢?

使用:open -a TextEdit settings.xml 参数说明:-a指定应用

也可以是:open -e settings.xml 参数说明:-e使用文本编辑器打开

也可以是:open -t settings.xml 参数说明:-t使用默认编辑器打开

C++类型转换以及文件读写的总结相关推荐

  1. C++ builder 的文件读写操作总结

    C++ builder 的文件读写操作总结 在编程的过程中,文件的操作是一个经常用到的问题,在C++Builder中,可以使用多种方法对文件操作,下面我就按以下几个部分对此作详细介绍,就是: 1.基于 ...

  2. java文件读写操作类

    借鉴了项目以前的文件写入功能,实现了对文件读写操作的封装 仅仅需要在读写方法传入路径即可(可以是绝对或相对路径) 以后使用时,可以在此基础上改进,比如: 写操作: 1,对java GUI中文本框中的内 ...

  3. C/C++ 文件读写操作总结

    C/C++ 文件读写操作总结 在编程的过程中,文件的操作是一个经常用到的问题,在C++Builder中,可以使用多种方法对文件操作,下面我就按以下几个部分对此作详细介绍,就是: 1.基于C的文件操作: ...

  4. c++ 文件读写(转)

    C/C++ code //创建一个文本文件并写入信息 //同向屏幕上输出信息一样将信息输出至文件 #include<iomanip.h> #include<fstream.h> ...

  5. 章节十六:编码和文件读写

    章节十六:编码和文件读写 目录 章节十六:编码和文件读写 1. 编码 1.1 二进制 1.2 编码表 1.3 encode()和decode() 2. 文件读写 2.1 读取文件 2.2 写入文件 2 ...

  6. 【台大郭彦甫】Matlab入门教程超详细学习笔记四:数据类型与文件读写(附PPT链接)

    变量类型与文件读写 前言 一.变量类型 1.numeric(数值类型) 2.char(字符类型) 3.string(字符串类型) 4.structure(结构体) 5.cell(元胞数组) 5.高维数 ...

  7. C/C++文件读写操作 —— windowsAPI

    转自:http://blog.sina.com.cn/s/blog_6e7fed390100z0j1.html 基于C的文件操作 在ANSI C中,对文件的操作分为两种方式,即流式文件操作和I/O文件 ...

  8. matlab读文件函数程序,Matlab 文件读写函数

    MATLAB中的文件 m文件: 命令行方式程序可读性差,而且不能存储,对于复杂的问题,应编写成能存储的程序文件.包含matlab语言代码的文件称为m文件,其扩展名为m. 用户如想灵活应用matlab去 ...

  9. C文件操作、读写文件 C++文件读写、文件操作

    转自  飘羽随风 基于C的文件操作  在ANSI C中,对文件的操作分为两种方式,即流式文件操作和I/O文件操作,下面就分别介绍之. 一.流式文件操作 这种方式的文件操作有一个重要的结构FILE,FI ...

  10. SO逆向入门实战教程八:文件读写

    文章目录 一.前言 二.demo1设计 三.Unidbg模拟执行demo1 四.demo2设计 五.Unidbg模拟执行demo2 六.尾声 一.前言 本篇分析的是自写demo,帮助大家熟悉Unidb ...

最新文章

  1. 走近“颠覆性技术”:量子通信能否取代传统通信?
  2. Sublime Text 提示[Decode error - output not utf-8]的解决方法
  3. 移动前端开发中添加一些webkit专属的HTML5头部标签,帮助浏览器更好解析html代码,更好地将移动web前端页面表现出来。本文整理一些常用的meta标签...
  4. 09.snapshot and restore操作
  5. java数组转换成string_java面试复习重点:类的管理及常用工具,教你抓住面试重点
  6. 美国夫妇用数学算法买彩票赢1.74亿元——网友:现在学数学还来得及吗?
  7. Docker容器技术-基础与架构
  8. 4键电子手表说明书_飞猪II控制台简体中文说明书
  9. postgresql编译安装及配置
  10. 【转载】究竟什么是POJO?
  11. UFLDL教程 -- 译文版
  12. ug二次开发python_UG/NX二次开发入门指导
  13. CDR是什么软件?用来做什么的,CorelDRAW版本更新历史及快捷键教程分享下载
  14. KingbaseES V8R6 集群运维系列 -- 命令行部署repmgr管理集群+switchover测试
  15. Debian Etch 安装指南
  16. 网络工程师十月份免费讲座
  17. 设计师必备的导航网站
  18. flash as3.0 图片切换
  19. 触发拍照4G低功耗摄像机数据监控方案
  20. 一步一步构建手机WebApp开发——页面布局篇

热门文章

  1. always@(敏感列表)
  2. 如何使IE地址栏里显示自己的小图片?
  3. IE8中怎样使用脚本隐藏弹出窗口的地址栏
  4. 第二关练习讲解(下部)
  5. MFC之对于文档类的DeleteContents和OnNewDocument说明29
  6. 论文笔记 | code representation(代码表示学习)系列
  7. DeepLearning论文阅读笔记(一):Cyclical Learning Rates for Training Neural Networks(CLR)
  8. 言语中心理解题(必要条件,程度词,并列关系)
  9. shader三种变量类型(uniform,attribute和varying)
  10. solidity 函数修饰器 modifier