C_文件编码类型判断

合集下载

c语言写文件的编码格式

c语言写文件的编码格式

c语言写文件的编码格式一、概述C语言提供了丰富的文件操作功能,包括文件的创建、读取、写入、追加等。

在写入文件时,我们需要考虑编码格式的问题,以确保文件在不同操作系统和不同字符集下的可读性。

本篇文档将介绍C语言中写文件的编码格式及其相关问题。

二、编码格式选择1. 默认编码格式:C语言在默认情况下,使用系统的默认编码格式来写入文件。

不同的操作系统有不同的默认编码格式,这可能导致在不同系统之间移植文件时出现乱码。

2. 指定编码格式:为了避免默认编码格式带来的问题,我们可以手动指定编码格式来写入文件。

常见的编码格式有UTF-8、GBK等。

在C语言中,可以使用`setvbuf`函数来指定缓冲区类型和大小,从而控制编码格式。

三、UTF-8编码格式1. 定义:UTF-8是一种变长编码的Unicode字符集,用于在计算机之间传输和存储文本数据。

UTF-8编码支持全球各种语言的字符,且兼容ASCII字符集。

2. 写入UTF-8编码文件:在C语言中,可以使用`fopen`函数以UTF-8编码格式打开文件,并使用`fprintf`函数将数据写入文件。

在写入数据时,需要使用UTF-8特定的转义序列来表示特殊字符。

3. 注意事项:UTF-8编码的文件在不同系统之间移植时可能出现乱码,因为不同的系统可能有不同的默认编码格式。

为了避免乱码问题,建议在写入文件时明确指定编码格式。

四、GBK编码格式1. 定义:GBK是一种常用的汉字编码标准,支持简体中文和繁体中文等汉字字符。

2. 写入GBK编码文件:在C语言中,可以使用`fopen`函数以GBK编码格式打开文件,并使用`fputs`函数将数据写入文件。

在写入数据时,需要使用GBK特定的转义序列来表示特殊字符。

3. 注意事项:使用GBK编码格式写入文件时,需要注意字符的字节数和行长度,以确保文件在写入时不会出现乱码问题。

同时,需要注意GBK编码只支持简体中文和繁体中文等少数汉字字符集,对于其他字符集可能无法正确处理。

文件分类及编码规则

文件分类及编码规则

审批及颁发:分发:文件再审记录:一、目的依照GMP要求,确立文件分类与编码规则,便于文件管理和追溯。

二、范围适用于文件分类与编码管理。

三、职责1 质量保证部负责文件体系的分类及编码规则,对各文件进行赋码。

2 各部门负责按照原则对文件进行分类管理;各部门起草文件时必须严格遵循文件编码的规定。

四、术语无五、内容1 文件分类1.1 一级文件:阐明公司内某一体系的方针,描述体系的文件。

主要包括:质量方针、质量管理手册、质量责任制、质量目标。

1.2 二级文件:主要描述为实施体系要素所涉及到的各职能部门的活动,或为完成某项活动而规定的方法。

包括:a)技术标准:包括工艺规程、质量标准、方案、报告等。

b)管理标准:包括计划、管理制度、清单、目录等,描述公司各主要过程的管理活动。

c)工作标准:包括部门职责、职务说明书。

d)工厂主文件。

1.3 三级文件:标准操作规程(SOP),描述各管理环节的操作要素和工作流程、具体的操作方法和步骤。

1.4 四级文件:记录、表格、合格证、图纸、标签、证书等。

2 文件编码2.1 文件分类编码应遵循以下原则:2.1.1 系统性:统一分类,统一编码。

按照文件分类建立编码系统,由质量保证部建立公司管理文件的分类和编码系统。

2.1.2 准确性:文件与编码一一对应,做到一文一码,一旦某文件终止使用,则该文件编码随即作废,不得再次使用。

2.1.3 可追踪性:可查询文件的演变历史。

2.1.4 识别性:文件的编码可反映出文件的文本和类别。

2.1.5 稳定性:任何人不得随意变动文件,若需变动,应经批准,并随之变更相关文件的编码。

2.1.6 相关一致性:文件一旦经过修订,必须给新的修订号,同时对其相关文件中出现的该文件编码进行修订。

2.1.7 发展性:考虑将来的发展及管理手段的改进。

2.2 全部文件均按编码管理,完整的公司文件编码系统格式如下:-+ 顺序号 + 版本号2.2.1 文件类型号2.2.2 文件系统号系统代号由一位英文字母组成,见下表:2.2.3 分系统号2.2.3.1 分系统号用以识别文件类别或车间,三位数字表示,从001,002, (999)2.2.4 顺序号为每个分系统从001,002,003,……开始的流水号。

c语言乱码问题详解

c语言乱码问题详解

c语言乱码问题详解在C语言编程中,乱码问题是一个非常常见的问题。

乱码通常是指在显示或输出字符串时,字符的编码格式不正确,导致字符无法正常显示。

这个问题可能由多种原因引起,本文将对C语言乱码问题进行全面详解。

一、乱码的产生原因1. 编码格式不统一:在C语言编程中,字符串通常使用ASCII编码或UTF-8编码。

如果不同程序或不同文件使用了不同的编码格式,就可能导致乱码。

2. 文件编码不统一:在编写和读取文件时,如果文件本身的编码格式与程序使用的编码格式不统一,也可能导致乱码。

3. 代码页设置不正确:在Windows系统中,代码页设置不正确可能导致乱码。

例如,默认的代码页是936(简体中文),如果设置为其他代码页,就可能导致乱码。

二、乱码的解决方案1. 统一编码格式:在编写程序时,确保所有文件和使用到的库都使用相同的编码格式。

通常建议使用UTF-8编码,因为它可以很好地表示各种字符集,包括简体中文、繁体中文和英文等。

2. 使用正确的代码页:在Windows系统中,确保代码页设置正确。

可以通过修改系统设置或编程时使用`SetConsoleOutputCP()`函数来设置代码页。

3. 使用字符串处理库:对于复杂字符集的支持,可以使用第三方字符串处理库,如iconv或ICU。

这些库可以提供丰富的字符编码转换功能,帮助解决乱码问题。

4. 使用命令行参数:在编写程序时,可以使用命令行参数来指定输入和输出文件的编码格式。

这样,即使在不同环境中运行程序,也可以确保编码的一致性。

三、案例分析下面我们通过一个简单的案例来说明如何解决C语言中的乱码问题。

假设我们有一个简单的C语言程序,用于将一个文本文件的内容读取到一个字符串数组中,然后输出到另一个文本文件。

在编写这个程序时,我们需要注意以下问题:1. 统一编码格式:确保源文件和使用到的库都使用UTF-8编码。

2. 使用正确的代码页:在Windows系统中,确保代码页设置为UTF-8(1200)。

cert c 编码标准

cert c 编码标准

CERT C 编码标准============本文档旨在介绍CERT(C 语言编码标准)中的一些主要方面,包括文件排版、注释规范和变量声明和初始化等。

这些标准是用于编写安全、可维护和一致的C 语言代码的重要指南。

1. 文件排版-------* 文件名应采用小写字母和下划线的组合,以描述性的方式命名。

* 每个源代码文件应以`.c` 或`.h` 作为文件扩展名。

* 代码应按照模块化原则组织,将相关的函数和数据结构分组到头文件和源文件中。

* 在源文件中,函数和数据结构应按照逻辑关系进行排序,以便于阅读和维护。

* 每个源文件应以包含一个定义了函数和数据结构的头文件开始。

* 在每个源文件中,函数和数据结构应以清晰、易于阅读的格式进行排列。

* 在代码中,缩进应一致,以增强代码的可读性。

建议使用四个空格作为缩进单位。

* 行长度不应超过80个字符,以提高代码的可读性。

* 在函数之间应使用空行分隔,以增强代码的可读性。

2. 注释规范-------* 在源文件的顶部,应包含一个简短的注释,描述文件的作用和内容。

* 在每个函数之前,应添加一个注释块,描述函数的作用、输入参数和返回值。

* 在复杂的代码段之前,应添加注释说明代码的目的和实现方法。

* 对于全局变量和重要数据类型,应添加注释说明其作用和使用方法。

* 对于不常用的函数或数据结构,应添加注释说明其使用方法和实现细节。

* 对于代码中的重要决策点或特殊处理,应添加注释说明原因和实现细节。

* 对于可能产生副作用的函数调用,应添加注释说明其可能的影响和注意事项。

* 对于需要调试的代码段,应添加注释说明调试方法和可能的错误原因。

* 对于使用到的第三方库或工具,应添加注释说明其版本号、作用和使用方法。

* 对于可能存在的性能问题或潜在的优化点,应添加注释说明原因和解决方案。

3. 变量声明和初始化--------------* 在函数内部,变量应尽早声明和使用。

* 在函数内部,不应声明多个变量在同一行。

C语言编码规范

C语言编码规范

z if、for、while、switch等与后面的括号间应加空格,使if等关键字更为突出、明显。 if (a >= b && c > d)
USTB ROBOTEAM
C 语言编码规范
可读性
z I注意运算符的优先级,并用括号明确表达式的操作顺序,避免使用默认优先级。
说明:防止阅读程序时产生误解,防止因默认的优先级与设计思想不符而导致程序出错。 示例:下列语句中的表达式
Description: a short introduction of this module.
Revision History:
Date
Rel Ver. Noຫໍສະໝຸດ esmonth/day/year
x.x [e.g.] Module created
***********************************************************/
/* code two comments */ program code two
USTB ROBOTEAM
C 语言编码规范
6. 在代码的功能、意图层次上进行注释,提供有用、额外的信息。 说明:注释的目的是解释代码 的目的、功能和采用的方法,提供代码以外的信息,帮助读者理解代码,防止没必要的重复注 释信息。 例如:如下注释意义不大。 /* if receive_flag is TRUE */ if (receive_flag) 而如下的注释则给出了额外有用的信息。 /* if mtp receive a message from links */ if (receive_flag)
word = (high << 8) | low (1)

C和C++编码规范

C和C++编码规范

C/C++编码规则编写与修改记录I目录章节目录第1章前言.....................................................................................................................................................- 7 -第2章RULECHECKER规则集........................................................................................................- 7 -2.1基本规则集 (7)2.1.1ansi 函数的声明和定义要遵守ANSI规定的格式 .....................................................- 7 -2.1.2asscal 在函数调用语句中不要使用赋值操作符..........................................................- 8 -2.1.3asscon 不要在控制语句的条件表达式中使用赋值操作符.......................................- 9 -2.1.4assexp 赋值表达式中的规定 ............................................................................................- 9 -2.1.5blockdecl 在语句块的头部定义变量........................................................................... - 10 -2.1.6boolean 使用正确格式的布尔表达式.......................................................................... - 10 -2.1.7brkcont 程序中禁用break、continue............................................................................- 11 -2.1.8classuse 对未知类成员的使用........................................................................................- 11 -2.1.9cmclass一个源文件只对应一个类 ............................................................................... - 12 -2.1.10cmdef 源文件中不要有类的声明................................................................................. - 12 -2.1.11condop 关于"? ... : ..." 操作符....................................................................................... - 12 -2.1.12const 使用常量.................................................................................................................. - 13 -2.1.13constrcpy 关于拷贝构造函数 ........................................................................................ - 14 -2.1.14constrdef 关于默认构造函数......................................................................................... - 14 -2.1.15ctrlblock 清晰划分控制语句的语句块........................................................................ - 15 -2.1.16destr 关于析构函数.......................................................................................................... - 15 -2.1.17dmaccess 类数据成员的访问控制................................................................................ - 16 -2.1.18exprcplx 表达式的复杂性 .............................................................................................. - 16 -2.1.19exprparenth 在表达式中使用括号................................................................................ - 17 -2.1.20fntype 必须为函数返回值指定类型 ............................................................................ - 18 -2.1.21frndclass 关于友员的声明位置..................................................................................... - 18 -2.1.22funcres 设置禁止使用的函数........................................................................................ - 18 -2.1.23goto 禁用Goto语句 ........................................................................................................ - 19 -2.1.24Headercom 对文件注释的要求..................................................................................... - 20 -2.1.25headercom 函数、类的注释 .......................................................................................... - 21 -2.1.26hmclass 一个头文件中只声明一个类 ......................................................................... - 21 -2.1.27hmdef 头文件中只包含声明,不应包含实现........................................................... - 21 -2.1.28hmstruct 避免重复包含头文件...................................................................................... - 22 -- 1 -C/C++编码规则V1.02.1.29identfmt 对命名的要求 ................................................................................................... - 23 -2.1.30identl 对标识符长度的要求........................................................................................... - 23 -2.1.31identres 设置禁止使用的标识符................................................................................... - 24 -2.1.32imptype 明确指定类型.................................................................................................... - 24 -2.1.33incltype 设置可包含的文件 ........................................................................................... - 24 -2.1.34inldef 关于内联函数的声明和定义 ............................................................................. - 25 -2.1.35macrocharset 在宏中禁用某些字符 ............................................................................. - 25 -2.1.36macroparenth 括号在宏中的使用................................................................................. - 26 -2.1.37mconst 限制宏常量的使用............................................................................................. - 26 -2.1.38mfunc 用内联函数代替宏函数 ..................................................................................... - 27 -2.1.39mname 文件命名 .............................................................................................................. - 28 -2.1.40multiass 一条程序语句中只应包含一个赋值操作符 .............................................. - 29 -2.1.41nopreproc 限制使用编译指令........................................................................................ - 29 -2.1.42nostruct 不要使用结构体................................................................................................ - 30 -2.1.43notemplate 不要使用模板............................................................................................... - 30 -2.1.44nothrow 不要抛掷异常.................................................................................................... - 30 -2.1.45nounion 不要使用联合体 ............................................................................................... - 30 -2.1.46operass 为类重载“=”操作符 ..................................................................................... - 31 -2.1.47parammode 明确标识出函数参数的类型................................................................... - 31 -2.1.48parse 分析错误.................................................................................................................. - 32 -2.1.49ptraccess 指针指向的数据成员的访问方式............................................................... - 32 -2.1.50ptrinit 对指针的初始化................................................................................................... - 32 -2.1.51sectord "public", "private"和"protected" 的声明顺序 ............................................... - 33 -2.1.52sgancstr 拥有共同的基类 ............................................................................................... - 35 -2.1.53sgdecl 一次只声明、定义一个变量 ............................................................................ - 35 -2.1.54sglreturn 一个函数应该只有一条return语句........................................................... - 35 -2.1.55slcom 注释使用“//”........................................................................................................ - 36 -2.1.56slstat 一行只写一条语句 ................................................................................................ - 36 -2.1.57swdef switch语句中的default分支.............................................................................. - 37 -2.1.58swend 对switch语句中每个分支结尾的要求.......................................................... - 37 -2.1.59typeinher 明确指明派生类与基类的关系................................................................... - 38 -2.1.60typeres 设置禁用的类型................................................................................................. - 38 -2.1.61vararg 禁止函数使用可变数量的参数........................................................................ - 39 -2.1.62varstruct 关于定义struct、union变量 ........................................................................ - 39 -2.2S COTT M EYERS 规则集.. (40)2.2.1assignthis 在"="操作符定义中检查是否自己赋值给自己 ..................................... - 40 -- 2 -C/C++编码规则V1.02.2.2cast Prefer 尽量使用C++风格的类型转换 ................................................................ - 41 -2.2.3catchref 通过引用捕获异常 ........................................................................................... - 41 -2.2.4constrinit 尽量在构造函数的初始化列表中对数据成员初始化 .......................... - 42 -2.2.5convnewdel 重载new、delete操作符时应遵守的约定.......................................... - 42 -2.2.6dataptr 指针数据成员...................................................................................................... - 43 -2.2.7delifnew 如果你重载了操作符"new",也应该重载操作符"delete"................ - 43 -2.2.8excepspec 审慎使用异常处理 ....................................................................................... - 43 -2.2.9inlinevirt 内联虚拟函数.................................................................................................. - 43 -2.2.10multinher 尽量不要使用多继承.................................................................................... - 44 -2.2.11nonleafabs 将非末端类设计为抽象类......................................................................... - 44 -2.2.12normalnew 不要遮掩了"new"的正规形式.................................................................. - 45 -2.2.13overload 不要重载“&&”、“||”、“,”................................................................. - 45 -2.2.14prepost “++”、“--”操作符前缀形式与后缀形式的区别................................... - 45 -2.2.15refclass 类的引用.............................................................................................................. - 46 -2.2.16returnthis 在重载“=”时,使其返回*this ................................................................ - 46 -2.2.17tryblock Try语句块........................................................................................................... - 47 -2.2.18trydestr 析构函数中的异常处理................................................................................... - 47 -2.2.19virtdestr 虚拟析构函数(Virtual destructor) ........................................................... - 47 -2.2.20assignthis(Check for Assignment to "self" in Operator "=" ) .............................. - 48 -2.2.21cast(c++风格的类型转换) ....................................................................................... - 48 -2.2.22dataptr(数据的指针类型)........................................................................................... - 48 -2.2.23delarray (Use square brackets when deleting arrays to ensure full array isdeallocated)............................................................................................................................................ - 49 -2.2.24exprparenth(Parenthesses should be used to indicate evaluation order)............. - 50 -2.2.25forinit (循环的计数器(在for循环中)必须在循环的初始化语句段中初始化)- 51 -2.2.26funcptr(不使用函数指针) .......................................................................................... - 51 -2.2.27globinit (全局变量必须在定义的时候初始化).................................................... - 52 -2.2.28multinher(Multiple Inheritance Only Allowed for Inheriting Abstract )........... - 52 -2.2.29nonleafabs (Make non-leaf classes abstract).................................................................. - 52 -2.2.30nostruct ................................................................................................................................. - 52 -2.2.31pmfrtn (不返回指针成员数据) ....................................................................................... - 53 -2.2.32refclass (类的引用) ............................................................................................................ - 53 -2.2.33rtnlocptr (不能返回一个指向一个非静态局部变量) ................................................ - 53 -2.2.34vararg vararg(Variable Number of Arguments ).................................................... - 53 -2.2.35varinit(参数在使用前要初始化)............................................................................ - 53 -- 3 -C/C++编码规则V1.02.2.36varstruct(Struct 和Union 变量)........................................................................... - 54 -2.2.37voidptr(没有空指针) ................................................................................................... - 55 -2.3MISRA C规则集 . (55)2.3.1Operator defined.操作符定义.......................................................................................... - 55 -2.3.2Pointer arithmetic算术指针 ............................................................................................ - 56 -2.3.3Limitation of the reference complexity .......................................................................... - 56 -2.3.4Relational operators and pointers操作符和指针之间的连系 .................................. - 56 -2.3.5Pointers to functions函数指针........................................................................................ - 56 -2.3.6Pointers to functions. ......................................................................................................... - 56 -2.3.7Address assignment.地址分配......................................................................................... - 57 -2.3.8Null pointer.空指针............................................................................................................ - 57 -2.3.9structures 和unions成员 ............................................................................................... - 57 -2.3.10V ariable storage.变量存储................................................................................................ - 57 -2.3.11Identifiers must not exceed 31 characters.标识符不要超过31个字符.................. - 57 -2.3.12Unions access. Union访问............................................................................................... - 58 -2.3.13Type of bitfields.位域类型............................................................................................... - 58 -2.3.14Two bits long bit fields.位域两字节长度...................................................................... - 58 -2.3.15Members of structure and unions shall be named......................................................... - 58 -2.3.16Define and undef standard names.................................................................................... - 58 -2.3.17Standard library functions.标准库函数.......................................................................... - 59 -2.3.18Dynamic heap memory.动态分配内存.......................................................................... - 59 -2.3.19Error indicator errno.错误指示errno ........................................................................... - 59 -2.3.20Name of identifiers.标识符命名 ..................................................................................... - 59 -2.3.21No offsetof macro............................................................................................................... - 60 -2.3.22No <locale.h> functions. ................................................................................................... - 60 -2.3.23No setjmp macro or longjmp function. ........................................................................... - 60 -2.3.24No <signal.h> functions. ................................................................................................... - 60 -2.3.25No <stdio.h> functions. ..................................................................................................... - 60 -2.3.26No atof, atoi or atol functions........................................................................................... - 61 -2.3.27No abort, exit, getenv or system functions..................................................................... - 61 -2.3.28No <time.h> functions....................................................................................................... - 61 -2.3.29Type char is not allowed.................................................................................................... - 62 -2.3.30Underlying representation of floating point numbers. ................................................. - 62 -2.3.31Typedef names shall not be reused. ................................................................................. - 62 -2.3.32Numeric constants and suffixes. ...................................................................................... - 63 -2.3.33Octal constants. 八进制常量 .......................................................................................... - 63 -- 4 -C/C++编码规则V1.02.3.34Declaration before use. ...................................................................................................... - 64 -2.3.35Identifiers scope.................................................................................................................. - 64 -2.3.36Object declarations............................................................................................................. - 64 -2.3.37Functions declaration......................................................................................................... - 65 -2.3.38External definition of identifiers...................................................................................... - 65 -2.3.39External variables declaration. ......................................................................................... - 65 -2.3.40register storage class specifier. ......................................................................................... - 66 -2.3.41Use of tags. .......................................................................................................................... - 66 -2.3.42Structured initialisation.结构初始化 .............................................................................. - 66 -2.3.43Enum Initialisation数组初始化...................................................................................... - 66 -2.3.44Side effects in condition .................................................................................................... - 67 -2.3.45Logical Operand. ................................................................................................................ - 67 -2.3.46Bitwise operations shall not be performed on signed integer types........................... - 67 -2.3.47Shift operator and right hand operand. ........................................................................... - 68 -2.3.48The unary minus operator shall not be applied to an unsigned expression. ............. - 68 -2.3.49Operator sizeof.................................................................................................................... - 68 -2.3.50Operator ',' not allowed...................................................................................................... - 68 -2.3.51Conversions. ........................................................................................................................ - 69 -2.3.52Redundant casts. ................................................................................................................. - 69 -2.3.53Cast and pointers. ............................................................................................................... - 69 -2.3.54Evaluation order of expressions....................................................................................... - 69 -2.3.55Mixed precision arithmetic and cast................................................................................ - 69 -2.3.56Test between floats. ............................................................................................................ - 69 -2.3.57Inaccessible code not authorized. .................................................................................... - 70 -2.3.58Non-null statements. .......................................................................................................... - 70 -2.3.59Location of null statements............................................................................................... - 70 -2.3.60No Labels............................................................................................................................. - 70 -2.3.61Use of curly brackets ......................................................................................................... - 71 -2.3.62Then and else parts of if statements must not be void ................................................. - 71 -2.3.63Default statement mandatory in a switch. ...................................................................... - 71 -2.3.64No switch with only one case........................................................................................... - 71 -2.3.65Floating point variables should not be used as loop counters..................................... - 72 -2.3.66Loop control. ....................................................................................................................... - 72 -2.3.67Counter in for statements .................................................................................................. - 72 -2.3.68Functions shall always be declared at file scope........................................................... - 72 -2.3.69No functions with variable number of arguments......................................................... - 72 -- 5 -C/C++编码规则V1.02.3.70Trigraphs are forbidden. .................................................................................................... - 72 -2.3.71Recursion not recommended ............................................................................................ - 73 -2.3.72Function prototyping.......................................................................................................... - 73 -2.3.73Matching numbers of parameters. ................................................................................... - 73 -2.3.74V alues of void functions. ................................................................................................... - 73 -2.3.75V oid expressions and function parameters. .................................................................... - 73 -2.3.76Return in non-void functions............................................................................................ - 73 -2.3.77Return in void functions. ................................................................................................... - 74 -2.3.78Function with no parameters. ........................................................................................... - 74 -2.3.79Multibyte characters........................................................................................................... - 74 -2.3.80No nested comments. ......................................................................................................... - 74 -2.3.81Define and undefine in a block. ....................................................................................... - 74 -2.3.82Use of #undef. ..................................................................................................................... - 74 -2.3.83Functions and macros. ....................................................................................................... - 75 -2.3.84Arguments to function-like macros. ................................................................................ - 75 -2.3.85Parentheses for macro occurences. .................................................................................. - 75 -2.3.86Parentheses for macro........................................................................................................ - 75 -2.3.87Identifiers in pre-processor directives............................................................................. - 75 -2.3.88Directive pragma. ............................................................................................................... - 75 -2.3.89Forbidden #include............................................................................................................. - 75 -2.3.90Use of void type and functions......................................................................................... - 76 -2.3.91#include syntax. .................................................................................................................. - 76 -- 6 -第1章前言本文挡详细描述了在Logiscope——Rulechecker中包含的所有编码规范。

C语言:字符编码

C语言:字符编码

C语⾔:字符编码C语⾔是 70 年代的产物,那个时候只有 ASCII,各个国家的字符编码都还未成熟,所以C语⾔不可能从底层⽀持 GB2312、GBK、Big5、Shift-JIS 等国家编码,也不可能⽀持 Unicode 字符集。

稍微有点C语⾔基本功的读者可能认为C语⾔使⽤ ASCII 编码,字符在存储时会转换成对应的 ASCII 码值,这也是错误的,你被⼤学⽼师和教材误导了!在C语⾔中,只有 char 类型的窄字符才使⽤ ASCII 编码,char 类型的窄字符串、wchar_t 类型的宽字符和宽字符串都不使⽤ASCII 编码!wchar_t 类型的宽字符和宽字符串使⽤ UTF-16 或者 UTF-32 编码,这个在上节已经讲到了,现在只剩下 char 类型的窄字符串(下⾯称为窄字符串)没有讲了,这就是本节的重点。

对于窄字符串,C语⾔并没有规定使⽤哪⼀种特定的编码,只要选⽤的编码能够适应当前的环境即可,所以,窄字符串的编码与操作系统和编译器有关。

但是,可以肯定的说,在现代计算机中,窄字符串已经不再使⽤ ASCII 编码了,因为 ASCII 编码只能显⽰字母、数字等英⽂字符,对汉语、⽇语、韩语等其它地区的字符⽆能为⼒。

讨论窄字符串的编码要从以下两个⽅⾯下⼿。

源⽂件使⽤什么编码源⽂件⽤来保存我们编写的代码,它最终会被存储到本地硬盘,或者远程服务器,这个时候就要尽量压缩⽂件体积,以节省硬盘空间或者⽹络流量,⽽代码中⼤部分的字符都是 ASCII 编码中的字符,⽤⼀个字节⾜以容纳,所以 UTF-8 编码是⼀个不错的选择。

UTF-8 兼容 ASCII,代码中的⼤部分字符可以⽤⼀个字节保存;另外 UTF-8 基于 Unicode,⽀持全世界的字符,我们编写的代码可以给全球的程序员使⽤,真正做到技术⽆国界。

常见的 IDE 或者编辑器,例如 Xcode、Sublime Text、Gedit、Vim 等,在创建源⽂件时⼀般也默认使⽤ UTF-8 编码。

C语言编码规范

C语言编码规范
9-6:过程/函数中申请的(为打开文件而使用的)文件句柄,在过程/函数退出之前要关闭。
9-7:防止内存操作越界。
9-8:认真处理程序所能遇到的各种出错情况。
9-9:系统运行之初,要初始化有关变量及运行环境,防止未经初始化的变量被引用。
9-10:系统运行之初,要对加载到系统中的数据进行一致性检查。
2-8:注释应与其描述的代码相近,对代码的注释应放在其上方或右方(对单条语句的注释)相邻位置,不可放在下面,如放于上方则需与其上面的代码用空行隔开。
2-9:对于所有有物理含义的变量、常量,如果其命名不是充分自注释的,在声明时都必须加以注释,说明其物理含义。变量、常量、宏的注释应放在其上方相邻位置或右方。
作者Email地址:xianggu@
2-10:数据结构声明(包括数组、结构、类、枚举等),如果其命名不是充分自注释的,必须加以注释。对数据结构的注释应放在其上方相邻位置,不可放在下面;对结构中的每个域的注释放在此域的右方。
2-11:全局变量要有较详细的注释,包括对其功能、取值范围、哪些函数或过程存取它以及存取时注意事项等的说明。
2-12:注释与所描述内容进行同样的缩排。
1-4:循环、判断等语句中若有较长的表达式或语句,则要进行适应的划分,长表达式要在低优先级操作符处划分新行,操作符放在新行之首。
1-5:若函数或过程中的参数较长,则要进行适当的划分。
1-6:不允许把多个短语句写在一行中,即一行只写一条语句。
1-7:if、while、for、default、do等语句自占一行。
7-3:编程的同时要为单元测试选择恰当的测试点,并仔细构造测试代码、测试用例,同时给出明确的注释说明。测试代码部分应作为(模块中的)一个子模块,以方便测试代码在模块中的安装与拆卸(通过调测开关)。

C语言中的编码规范和文档写作

C语言中的编码规范和文档写作

C语言中的编码规范和文档写作在C语言编程中,良好的编码规范和文档写作是十分重要的。

编码规范能够提高代码的可读性和可维护性,而文档的撰写则可以帮助我们更好地理解代码、团队协作以及后期维护。

本文将分别介绍C语言中的编码规范和文档写作技巧。

一、C语言的编码规范1. 命名规范在C语言中,变量、函数、宏等都需要遵循一定的命名规范,以便于其他人理解和使用。

一般而言,命名应具有描述性和明确性,使用有意义的单词或缩写。

例如,变量名应该使用小写字母和下划线,如"student_name";常量名应该使用全大写字母和下划线,如"MAX_SCORE";函数名可以使用驼峰命名法,如"calculateAverage"。

2. 缩进和格式化良好的缩进和格式化可以增加代码的可读性。

在C语言中,通常使用四个空格进行缩进,并在控制语句、循环语句、函数等块的开始和结束位置加上花括号进行标识。

例如:```cif (condition) {// do something}```3. 注释规范注释是代码中非常重要的一部分,可以帮助他人理解代码的意图。

在编写注释时,应遵循以下规范:- 使用自然语言,描述代码的用途和实现思路;- 避免写无用的注释,注释应与代码同样重要;- 在函数头部添加注释,说明函数的作用、参数和返回值;- 在关键性代码处添加注释,解释其逻辑和用途。

4. 错误处理与异常在编码过程中,及时处理错误和异常情况是非常重要的,可以提高程序的稳定性。

在C语言中,可以使用错误码、异常处理机制等方式来处理错误和异常。

例如,可以定义一些错误码常量,并在函数出现错误时返回相应的错误码,同时在函数调用处进行判断和处理。

二、C语言的文档写作1. 函数文档编写函数文档可以帮助其他开发人员快速了解函数的作用和用法。

一个良好的函数文档应包括以下内容:- 函数的作用和功能描述;- 函数的参数说明,包括参数类型和意义;- 函数的返回值说明;- 函数的使用示例。

嵌入式C语言编码规范(精简版)

嵌入式C语言编码规范(精简版)

INT8U aucReceiverID[RECEIVERID_SIZE];
INT8U *pucReceiverBuff;
}SDARS_DispReceiverID_st,*pSDARS_DispRec
eiverID_st;
pSDARS_DispReceiverID_st apstDispReceiverI
嵌入式C语言编码规范
3 Sept. 2008 © Neusoft Confidential
规范内容
一、引言 二、规范
1、文件内部构成 2、命名规范 3、标识符和常量 4、类型和类型转换 5、初始化、声明和定义 6、控制语句和表达式 7、函数 8、指针和数组 9、结构与联合 10、预处理指令
一、引言
7
unsigned[int]
8
double
9
float
10
pointer
11
void
12
array of
Prefix bt b c i s l u d f p v/vd a
Example
bit btVariable; boolean bVariable; char cVariable; int i; short[int] sVariable; long[int] lVariable; unsigned[int] uiVariable; double dVariable; float fVariable; void *pvVariable; void *pvVariable; char acVariable[TABLE_MAX];
No.
基本数据类型
1
typedef unsigned char
2
typedef unsigned char

文件的编码规则

文件的编码规则

文件的编码规则
文件的编码规则是指用于表示文件内容的一组字符编码标准。

不同的编码规则适用于不同的语言和字符集,以确保文件内容的正确表示和传输。

在处理文件时,了解文件的编码规则非常重要。

这是因为不同的编码规则可能导致文件内容的显示方式不同,甚至可能导致文件无法正确读取。

常见的文件编码规则包括:
1. ASCII 编码:ASCII 编码是一种单字节编码标准,用于表示英文字符、数字和符号。

它是计算机中最常用的编码标准之一。

2. UTF-8 编码:UTF-8 是一种可变长度字符编码标准,用于表示Unicode 字符集中的字符。

它是一种向后兼容ASCII 编码的编码方式,因此在ASCII 编码的基础上增加了对其他字符的表示方式。

3. GB2312 编码:GB2312 是一种用于简体中文的字符编码标准,由国家标准局制定。

它涵盖了常用的简体中文字符和标点符号。

4. GBK 编码:GBK 是一种在GB2312 基础上扩展的字符编码标准,支持更多的汉字和其他字符。

它广泛用于中文输入法和中文办公软件中。

5. Big5 编码:Big5 是一种用于繁体中文的字符编码标准,由台湾制定。

它涵盖了常用的繁体中文字符和标点符号。

除了以上常见的编码规则外,还有其他一些编码规则用于特定的语言和字符集。

在处理文件时,如果需要正确显示或处理特定语言的字符,
请确保选择正确的编码规则。

C语言编码规范

C语言编码规范
• 不要把NULL用在指针以外的场合
• 引用指针前,需要判断指针有效性 • 传入库函数中的变量需要进行有效性判断(C库函数)
3 Sept. 2008 Confidential
7 类型使用
规则:使用[ ]操作数组元素,而不要使用* 原理:避免隐含操作和意图
Example void foo() { int array[2]; *(array+1) = 0; //Violation *array = 0; } //Violation Repair void foo()
4 函数
• • • •
一定要显示声明函数的返回值类型。
如果函数不需要返回值,要声明为void Nhomakorabea型。如果函数没有参数,参数处要书写void。 函数的声明要与函数定义一致(包括函数的类型及参数的类型、个
数、顺序)。
3 Sept. 2008 Confidential
4 函数
• • • •
回避函数的递归调用。
• { }总是独立一行 • 每行只有一条语句 • 赋值操作符前后留有一个空格 • 位操作符前后留有一个空格
int main(void) • 逻辑判断操作符前后留有一个空格 { • 逗号后面加一个空格 int i; int val_a; • 分号后面加一个空格 int val_b; • 不能在操作符(++/--)与操作数之间出现 空格 for( i = 0; i < 10; i++) • 用空行将代码按逻辑片断划分 { c = get_max(val_a, val_b); } }
Example: void foo() { unsigned int uVal = 1u; uVal <<= 100; /* Violation */ }

初识C语言编码规范

初识C语言编码规范

C语言编码规范1-排版规则程序应采用缩进风格编写,每层缩进使用一个制表位(TAB),类定义、方法都应顶格书写;源程序建议使用英文书写,尽量不含有中文。

每行不超过80字符。

对于较长的语句(>80字符)要分成多行书写,长表达式要在低优先级操作符处划分新行,操作符放在新行之首,划分出的新行要进行适当的缩进,使排版整齐,语句可读;循环、判断等语句中若有较长的表达式或语句,则要进行适应的划分;左花括号要另起一行,不能跟在上一行的行末;一个变量定义占一行,一个语句占一行;对独立的程序块之间、变量说明之后必须加空行;在结构成员赋值等情况,等号对齐,最少留一个空格;若函数或过程中的参数较长,则要进行适当的划分。

形参的排序风格:最常使用的参数放在第一位;输入参数列表应放在输出参数列表的左边;将通用的参数放在特殊的参数的左边。

2-命名规范应用程序的命名“系统简称”+模块名称子模块的命名每个子模块的名字应该由描述模块功能的1-3以单词组成。

每个单词的首字母应大写。

在这些单词中可以使用一些较通用的缩写。

变量的命名变量的命名的基本原则是使得变量的含义能够从名字中直接理解。

可以用多个英文单词拼写而成,每个英文单词的首字母要大写,其中英文单词有缩写的可用缩写;变量的前缀表示该变量的类型;对于作用域跨越10行以上的变量名称不能少于4个字符,除循环变量,累加变量外不得使用I、j、k等名称的变量。

变量分为取全局变量和局部变量,对于全局变量以加前缀“g_”来区分。

使用有意义的英语单词,使用大小写分隔,每个单词的第一个字母为大写考虑到习惯性和简洁性,对于按常规使用的局部变量允许采用极短的名字,如用n、i作为循环变量,p、q作为指针等。

另外,要注意的是:全局变量在程序中不要定义太多,能用局部变量的就用局部变量。

如果要使用相关的变量,建议采用类的方式或者结构的方式存放,以减少具体变量的个数。

常量的命名常量所有的字母均为大写。

并且单词之间使用下划线”_”隔开。

2022年长沙县职业中专学校寒假作业(2)

2022年长沙县职业中专学校寒假作业(2)

1. 计算机病毒不可能具有( ) 。

[单选题]A、可触发性和传染性B、潜伏性和隐蔽性C、传染性和破坏性D、自行痊愈性和天生免疫性(正确答案)解释:计算机病毒不具有自行痊愈性和天生免疫性。

2. 计算机病毒通常会依附于其它文件而存在,是指计算机病毒具有( ) 。

[单选题]A、触发性B、传染性C、寄生性(正确答案)D、破坏性解释:计算机病毒通常会依附于其它文件而存在,是指计算机病毒具有寄生性。

3. 计算机病毒侵入系统后,普通不即将发作,而是等待“时机”一到才发作,这种特性叫作( ) 。

[单选题]A、传染性B、寄生性C、潜伏性(正确答案)D、隐蔽性解释:计算机病毒侵入系统后,普通不即将发作,而是等待“时机”一到才发作,这种特性叫作潜伏性。

4. 一种病毒的浮现,使得人们对计算机病毒只破坏计算机软件的认识发生了改变,这种计算机病毒是( ) 。

[单选题]A、冲击波B、木马病毒C 、backdoorD 、CIH(正确答案)解释:在CIH 病毒之前,计算机病毒只破坏计算机的软件系统,但是CIH 病毒且能破坏计算机的硬件。

5. 电子邮件的发件人利用某些特殊的电子邮件软件,在短期内不断重复地将电子邮件发送给同一个接收者,这种破坏方式叫做( ) 。

[单选题]A、邮件病毒B、邮件炸弹(正确答案)C、木马D、蠕虫解释:电子邮件的发件人利用某些特殊的电子邮件软件,在短期内不断重复地将电子邮件发送给同一个接收者,这种破坏方式叫做邮件炸弹。

6. 以下肯定不是计算机感染病毒的迹象的是( ) 。

[单选题]A、计算机运行程序异常,反应迟缓B、没有操作情况下,磁盘自动读写C、软驱弹不出软盘(正确答案)D、设备有异常现象,如显示怪字符,磁盘读不出来等解释:软驱弹不出软盘属性硬件故障,不是计算机病毒所能破坏的。

7. 有关计算机病毒描述正确的( ) 。

[单选题]A、它和生物病毒一样,可以感染人B、只要开机,病毒就会发作C、病毒是人为制作的程序(正确答案)D、只要系统速度变慢,电脑一定是感染上了病毒解释:计算机病毒是人为编制的具有破坏性的计算机程序。

安富莱C语言编码规范

安富莱C语言编码规范

安富莱C语言编码规范1.1文件与目录(1)文件及目录的命名规定可用的字符集是[A-Z;a-z;0-9;._-]。

(2)源文件名后缀用小写字母 .c和.h。

(3)文件的命名要准确清晰地表达其内容,同时文件名应该精练,防止文件名过长而造成使用不便。

在文件名中可以适当地使用缩写。

以下提供两种命名方式以供参考:●各程序模块的文件命名开头2个小写字母代表本模块的功能:如:主控程序为mpMain.c,mpDisp.c …●不写模块功能标识:如:主控程序为Main.c,Disp.c …(4)一个软件包或一个逻辑组件的所有头文件和源文件建议放在一个单独的目录下,这样有利于查找并使用相关的文件,有利于简化一些编译工具的设置。

(5)对于整个项目需要的公共头文件,应存放在一个单独的目录下(例如:myProject/include)下,可避免其他编写人引用时目录太过分散的问题。

(6)对于源码文件中的段落安排,我们建议按如下的顺序排列:●文件头注释●防止重复引用头文件的设置●#include部分●#define部分●enum常量声明●类型声明和定义,包括struct、union、typedef等●全局变量声明●文件级变量声明●全局或文件级函数声明●函数实现。

按函数声明的顺序排列●文件尾注释(7)在引用头文件时,不要使用绝对路径。

如果使用绝对路径,当需要移动目录时,必须修改所有相关代码,繁琐且不安全;使用相对路径,当需要移动目录时,只需修改编译器的某个选项即可。

(8)在引用头文件时,使用<> 来引用预定义或者特定目录的头文件,使用“”来引用当前目录或(12)对于文件的长度没有非常严格的要求,但应尽量避免文件过长。

一般来说,文件长度应尽量保持在1000行之内。

1.2排版(1)程序块要采用缩进风格编写,缩进的空格数为4个。

(3)较长的语句或函数过程参数(>80字符)要分成多行书写,长表达式要在低优先级操作符处划分(5)对齐使用TAB键,1个TAB对应4个字符位。

C语言windows下Ansi和UTF-8编码格式的转换

C语言windows下Ansi和UTF-8编码格式的转换

C语⾔windows下Ansi和UTF-8编码格式的转换 当我们使⽤MinGW-w64作为编译器在windows系统环境下进⾏C语⾔编程时,如果源代码⽂件(.c)保存格式为Ansi格式,则在打印汉字时不会出现乱码;反之,如果我们使⽤UTF-8格式保存,则会出现乱码,需要在编译时加上“-fexec-charset=gbk”来解决乱码问题。

#include <stdio.h>int main(){printf("%s\n", "你好,世界!");return0;} 那么,当我们使⽤C语⾔处理⽂件时,如果⽂件格式是UTF-8,如何转换成Ansi格式呢?注意:在windows下,txt的保存格式中有UTF-8和带有BOM的UTF-8两个选项。

如果选择带有BOM的UTF-8选项,则在读取⽂件时会⾸先读到三个标志着这个⽂件是由UTF-8格式编码的字符,分别为EF BB BF。

如果选择UTF-8,则不会有这三个字符,⽽是直接⼀开始就读到⽂件本⾝内容。

详情请看:1// char.h2// 头⽂件3// 定义结构体File,存储⽂件信息4// 定义结构体初始化函数以及其他函数56 #ifndef _H_CHAR_7#define _H_CHAR_89 #include <stdio.h>10 #include <stdbool.h>11 #include <stdlib.h>12 #include <windows.h>1314 unsigned char BOM[] = {0xEF, 0xBB, 0xBF}; // 带有BOM的UTF-8编码格式的⽂件会以这三个字符开头 1516// File结构体定义17 typedef struct file {18char *filename;19char *filemode;20char *encoding;21bool readable;22 } File;2324// 函数定义25 File *initializeFile(char *, char *); // 初始化结构体26bool isUTF8(char *); // 判断⽂件是否为UTF-8编码格式27bool isReadable(char *); // 判断filemode是否⽀持可读选项28bool charInString(char, char *); // 判断字符是否在字符串中29void fprint(File *); // 打印结构体内容30void fprintInfo(File *); // 打印结构体信息31void deconstructFile(File *); // 析构化结构体32void fprintAnsi(File *); // 以Ansi格式打印33// 转换函数定义34void Convert(const char* strIn, char* strOut, int sourceCodepage, int targetCodepage);35void UTF82Ansi(PCHAR Src, PCHAR Dst);36void Ansi2UTF8(PCHAR Src, PCHAR Dst);3738// 函数实现39 File *initializeFile(char *filename, char *filemode)40 {41 File *file = (File *)malloc(sizeof(File));42 file->filename = filename;43 file->filemode = filemode;44 file->encoding = "Ansi";45 file->readable = false;4647if (isUTF8(filename))48 {49 file->encoding = "UTF-8";50 }5152if (isReadable(filemode))53 {54 file->readable = true;55 }5657return file;58 }5960bool isUTF8(char *filename)61 {62 FILE *fp = fopen(filename, "r");6364if (fp == NULL)65 {66 printf("Unable to open file %s\n", filename);67return false;68 }6970 unsigned char *buffer = (unsigned char *)malloc(sizeof(unsigned char) * 3);71 fread(buffer, 3, 3, fp);72 fclose(fp);7374for (int i = 0; i < 3; i++)75 {76if (buffer[i] != BOM[i])77 {78return false;79 }80 }8182return true;83 }8485bool isReadable(char *filemode)86 {87if (charInString('r', filemode) || charInString('+', filemode))88 {89return true;90 }91return false;92 }9394bool charInString(char ch, char *str)95 {96while (*str != '\0')97 {98if (ch == *str)99 {100return true;101 }102 ++str;103 }104return false;105 }106107void fprintInfo(File *file)108 {109 printf("filename: %s\nfilemode: %s\nencoding: %s\nreadble: %d\n", file->filename, file->filemode, file->encoding, file->readable); 110 }111112void fprint(File *file)113 {114// 只有filemode中存在'r'或者'+'字符时,才可以调⽤fprint函数115if (!file->readable)116 {117return;118 }119120 FILE *fp = fopen(file->filename, file->filemode);121char chr;122123if (fp == NULL)124 {125 printf("Failed to open file %s\n", file->filename);126return;127 }128129while ((chr = fgetc(fp)) != EOF)130 {131 printf("%c", chr);132 }133134 puts("");135 fseek(fp, 0, SEEK_SET); // 重置到开头136137while ((chr = fgetc(fp)) != EOF)138 {139 printf("%x ", (unsigned char)chr);140 }141 printf("\n\n");142143 fclose(fp);144 }145146void deconstructFile(File *file)147 {148free(file);149 file = NULL;150 }151152void fprintAnsi(File *file)153 {154if (!file->readable)155 {156return;157 }158if (file->encoding == "Ansi")159 {160 fprint(file);161 }162else163 {164 FILE *fp = fopen(file->filename, file->filemode);165166int i = 0;167char ch;168char utf8[MAX_PATH] = {0};169char ansi[MAX_PATH] = {0};170171// 跳过头三个BOM字符172 fseek(fp, 3, SEEK_SET);173while ((ch = fgetc(fp)) != EOF)174 {175 utf8[i++] = ch;176 }177 utf8[i] = '\0';178 UTF82Ansi(utf8, ansi);179 printf("%s\n", ansi);180181 fclose(fp);182 fp = NULL;183 }184 }185186// 编码格式转换函数187void Convert(const char* strIn, char* strOut, int sourceCodepage, int targetCodepage)188 {189int len = lstrlenA(strIn);190int unicodeLen = MultiByteToWideChar(sourceCodepage, 0, strIn, -1, NULL, 0);191 wchar_t pUnicode[1024] = {0};192 MultiByteToWideChar(sourceCodepage, 0, strIn, - 1, (LPWSTR)pUnicode, unicodeLen);193194 BYTE pTargetData[2048] = {0};195int targetLen = WideCharToMultiByte(targetCodepage, 0, (LPWSTR)pUnicode, -1, (char*)pTargetData,0, NULL, NULL); 196 WideCharToMultiByte(targetCodepage, 0, (LPWSTR)pUnicode, -1,(char*)pTargetData, targetLen, NULL, NULL);197 lstrcpyA(strOut,(char*)pTargetData);198 }199void UTF82Ansi(PCHAR Src, PCHAR Dst)200 {201 Convert(Src,Dst,CP_UTF8,CP_ACP);202 }203void Ansi2UTF8(PCHAR Src, PCHAR Dst)204 {205 Convert(Src,Dst,CP_ACP, CP_UTF8);206 }207208#endifchar.h1 #include "char.h"23int main()4 {5 File *ansi = initializeFile("ansi.txt", "r");6 fprintInfo(ansi);7 fprint(ansi);8 deconstructFile(ansi);910 File *utf8 = initializeFile("utf-8-bom.txt", "r");11 fprintInfo(utf8);12 fprint(utf8);13 fprintAnsi(utf8);14 deconstructFile(utf8);1516return0;17 }main.c。

[重点]C编码规范试题三

[重点]C编码规范试题三

C++编码规范试题(满分100分)一、单选题(5*2)1、关于函数参数,不正确的说法是:A、对参数输入和非参数输入都要检查有效性。

B、防止将函数的参数作为工作变量。

C、在调用函数填写参数时,应尽量减少没有必要的默认数据类型转换或强制数据类型转换D、非调度函数应减少或防止控制参数,尽量不要使用数据参数。

2、宏定义#define SQUARE(a) ((a) * (a)) 在b = SQUARE(a++)中,a被执行了次加1A、0次;B、1次;C、2次;D、3次3. ()关于可测性,正确的说法是:A 断言用来处理必须处理的错误情况B 调试时打印的出错信息只要有错误码就行了C 软件的DEBUG版本与发行版本分为两套进行维护D 项目组内要有一套统一的错误输出函数4. ()以下程序中,可读性较好的有:A rect.length = 10; char_poi = str; rect.width = 5;B if (Trunk[index].trunk_state == 0)C word = (high << 8) | low;D * ++ stat_poi += 1;5、若已经定义:int a[9], *p = a;并在以后的语句中未改变p的值,能表示a[1]地址的表达式是:A、++a;B、a++;C、++p;D、p++;二、多选题(11*4)1、关于变量,正确的说法是:A、若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;B、若全局变量仅在单个函数中访问,则可以将这个变量修改为该函数的静态局部变量,以降低模块间的耦合度;C、设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题;D、静态全局变量过大,可能会导致堆栈溢出。

2、A机和B机通讯,使用以下结构struct A_B_COM{unsigned int a:6;unsigned int b:3;unsigned int :7;};对这个结构定义的评价中,正确的是:A、由于A机与B机可能使用不同的编译环境,该结构占用空间可能不一致;B、由于A机与B机可能字节序不同,位域的各位在内存中存放的顺序可不一致;C、第三个结构成员没有名字,编译会出错;D、结构中使用位域,不仅节省了空间,也提高了存取效率。

c语言中的文本与二进制

c语言中的文本与二进制

C语言中文本文件与二进制文件的区别是什么收藏一、文本文件与二进制文件的定义大家都知道计算机的存储在物理上是二进制的,所以文本文件与二进制文件的区别并不是物理上的,而是逻辑上的。

这两者只是在编码层次上有差异。

简单来说,文本文件是基于字符编码的文件,常见的编码有ASCII编码,UNICODE编码等等。

二进制文件是基于值编码的文件,你可以根据具体应用,指定某个值是什么意思(这样一个过程,可以看作是自定义编码)。

从上面可以看出文本文件基本上是定长编码的(也有非定长的编码如UTF-8),基于字符嘛,每个字符在具体编码中是固定的,ASCII码是8个比特的编码,UNICODE一般占16个比特。

而二进制文件可看成是变长编码的,因为是值编码嘛,多少个比特代表一个值,完全由你决定。

大家可能对BMP文件比较熟悉,就拿它举例子吧,其头部是较为固定长度的文件头信息,前2字节用来记录文件为BMP格式,接下来的8个字节用来记录文件长度,再接下来的4字节用来记录bmp文件头的长度。

大家可以看出来了吧,其编码是基于值的(不定长的,2、4、8字节长的值都有),所以BMP是二进制文件。

二、文本文件与二进制文件的存取文本工具打开一个文件的过程是怎样的呢?拿记事本来说,它首先读取文件物理上所对应的二进制比特流(前面已经说了,存储都是二进制的),然后按照你所选择的解码方式来解释这个流,然后将解释结果显示出来。

一般来说,你选取的解码方式会是ASCII码形式(ASCII码的一个字符是8个比特),接下来,它8个比特8个比特地来解释这个文件流。

例如对于这么一个文件流"01000000_01000001_01000010_01000011"(下划线''_'',是我为了增强可读性,而手动添加的),第一个8比特''01000000''按ASCII码来解码的话,所对应的字符是字符''A'',同理其它3个8比特可分别解码为''BCD'',即这个文件流可解释成“ABCD”,然后记事本就将这个“ABCD”显示在屏幕上。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/// <returns></returns>
private static bool IsUTF8Bytes(byte[] data)
பைடு நூலகம் {
int charByteCounter = 1; //计算当前正分析的字符应还有的字节数
byte curByte; //当前分析的字节.
for (int i = 0; i < data.Length; i++)
fs.Close();
return r;
}
/// <summary>
/// 通过给定的文件流,判断文件的编码类型
/// </summary>
/// <param name="fs">文件流</param>
/// <returns>文件的编码类型</returns>
{
reVal = Encoding.Unicode;
}
r.Close();
return reVal;
}
/// <summary>
/// 判断是否是不带 BOM 的 UTF8 格式
/// </summary>
/// <param name="data"></param>
public static System.Text.Encoding GetType(FileStream fs)
{
byte[] Unicode = new byte[] { 0xFF, 0xFE, 0x41 };
byte[] UnicodeBIG = new byte[] { 0xFE, 0xFF, 0x00 };
{
curByte = data[i];
if (charByteCounter == 1)
{
if (curByte >= 0x80)
{
//判断当前
while (((curByte <<= 1) & 0x80) != 0)
{
charByteCounter++;
}
//标记位首位若为非0 则至少以2个1开始 如:110XXXXX...........1111110X
if (charByteCounter == 1 || charByteCounter > 6)
{
public static System.Text.Encoding GetType(string FILE_NAME)
{
FileStream fs = new FileStream(FILE_NAME, FileMode.Open, FileAccess.Read);
Encoding r = GetType(fs);
int i;
int.TryParse(fs.Length.ToString(), out i);
byte[] ss = r.ReadBytes(i);
if (IsUTF8Bytes(ss) || (ss[0] == 0xEF && ss[1] == 0xBB && ss[2] == 0xBF))
public class EncodingType
{
/// <summary>
/// 给定文件的路径,读取文件的二进制数据,判断文件的编码类型
/// </summary>
/// <param name="FILE_NAME">文件路径</param>
/// <returns>文件的编码类型</returns>
return false;
}
}
}
else
{
//若是UTF-8 此时第一位必须为1
if ((curByte & 0xC0) != 0x80)
{
return false;
}
charByteCounter--;
{
reVal = Encoding.UTF8;
}
else if (ss[0] == 0xFE && ss[1] == 0xFF && ss[2] == 0x00)
{
reVal = Encoding.BigEndianUnicode;
}
else if (ss[0] == 0xFF && ss[1] == 0xFE && ss[2] == 0x41)
byte[] UTF8 = new byte[] { 0xEF, 0xBB, 0xBF }; //带BOM
Encoding reVal = Encoding.Default;
BinaryReader r = new BinaryReader(fs, System.Text.Encoding.Default);
}
}
if (charByteCounter > 1)
{
throw new Exception("非预期的byte格式");
}
return true;
}
}
相关文档
最新文档