C 备忘清单

提供基本语法和方法的 C 快速参考备忘单。

入门

hello.c

  1. #include <stdio.h>
  2. int main() {
  3. printf("Hello World!");
  4. return 0;
  5. }

使用 gcc 编译 hello.c 文件

  1. $ gcc -o hello hello.c

运行编译后的二进制文件(hello)

  1. $ ./hello
  2. # 输出 => Hello World

变量

  1. int myNum = 15;
  2. int myNum2; // 不赋值,然后再赋值
  3. myNum2 = 15;
  4. int myNum3 = 15; // myNum3 值为 15
  5. myNum3 = 10; // 现在 myNum3 值为 10
  6. float myFloatNum = 5.99; // 浮点数
  7. char myLetter = 'D'; // 字符串
  8. int x = 5;
  9. int y = 6;
  10. int sum = x + y; // 添加变量相加
  11. // 声明多个变量
  12. int x = 5, y = 6, z = 50;

常量 Constants

  1. const int minutesPerHour = 60;
  2. const float PI = 3.14;

最佳实践

  1. const int BIRTHYEAR = 1980;

注释

  1. // 这是一个注释
  2. printf("Hello World!"); // 这是一个注释
  3. /* 多行注释,上面的代码将打印出 Hello World!
  4. 到屏幕上,真是太棒了 */

打印文本

  1. printf("I am learning C.");
  2. int testInteger = 5;
  3. printf("Number = %d", testInteger);
  4. float f = 5.99; // 浮点数
  5. printf("Value = %f", f);
  6. short a = 0b1010110; // 2 进制数字
  7. int b = 02713; // 8 进制数字
  8. long c = 0X1DAB83; // 16 进制数字
  9. // 以 8 进制形似输出
  10. printf("a=%ho, b=%o, c=%lo\n", a, b, c);
  11. // 输出 => a=126, b=2713, c=7325603
  12. // 以 10 进制形式输出
  13. printf("a=%hd, b=%d, c=%ld\n", a, b, c);
  14. // 输出 => a=86, b=1483, c=1944451
  15. // 以 16 进制形式输出(字母小写)
  16. printf("a=%hx, b=%x, c=%lx\n", a, b, c);
  17. // 输出 => a=56, b=5cb, c=1dab83
  18. // 以 16 进制形式输出(字母大写)
  19. printf("a=%hX, b=%X, c=%lX\n", a, b, c);
  20. // 输出 => a=56, b=5CB, c=1DAB83

控制空格数

  1. int a1=20, a2=345, a3=700;
  2. int b1=56720, b2=9999, b3=20098;
  3. int c1=233, c2=205, c3=1;
  4. int d1=34, d2=0, d3=23;
  5. printf("%-9d %-9d %-9d\n", a1, a2, a3);
  6. printf("%-9d %-9d %-9d\n", b1, b2, b3);
  7. printf("%-9d %-9d %-9d\n", c1, c2, c3);
  8. printf("%-9d %-9d %-9d\n", d1, d2, d3);

输出结果

  1. 20 345 700
  2. 56720 9999 20098
  3. 233 205 1
  4. 34 0 23

%-9d 中,d 表示以 10 进制输出,9 表示最少占 9 个字符的宽度,宽度不足以空格补齐,- 表示左对齐

字符串 Strings

  1. char greetings[] = "Hello World!";
  2. printf("%s", greetings);

访问字符串

  1. char greetings[] = "Hello World!";
  2. printf("%c", greetings[0]);

修改字符串

  1. char greetings[] = "Hello World!";
  2. greetings[0] = 'J';
  3. printf("%s", greetings);
  4. // 输出 "Jello World!"

另一种创建字符串的方法

  1. char greetings[] = {'H','e','l','l','\0'};
  2. printf("%s", greetings);
  3. // 输出 "Hell!"

C 没有 String 类型,使用 char 类型并创建一个字符 array

条件判断

  1. int time = 20;
  2. if (time < 18) {
  3. printf("再会!");
  4. } else {
  5. printf("晚上好!");
  6. }
  7. // 输出 -> "晚上好!"
  8. int time = 22;
  9. if (time < 10) {
  10. printf("早上好!");
  11. } else if (time < 20) {
  12. printf("再会!");
  13. } else {
  14. printf("晚上好!");
  15. }
  16. // 输出 -> "晚上好!"

三元运算符

  1. int time = 20;
  2. (time < 18) ? printf("再会!") : printf("晚上好!");

Switch

  1. int day = 4;
  2. switch (day) {
  3. case 3: printf("周三"); break;
  4. case 4: printf("周四"); break;
  5. default:
  6. printf("期待周末");
  7. }
  8. // 输出 -> "周四" (day 4)

While 循环

  1. int i = 0;
  2. while (i < 5) {
  3. printf("%d\n", i);
  4. i++;
  5. }

注意:不要忘记增加条件中使用的变量,否则循环永远不会结束,成为“死循环”!

Do/While 循环

  1. int i = 0;
  2. do {
  3. printf("%d\n", i);
  4. i++;
  5. } while (i < 5);

For 循环

  1. int i;
  2. for (i = 0; i < 5; i++) {
  3. printf("%d\n", i);
  4. }

跳出循环 Break/Continue

  1. int i;
  2. for (i = 0; i < 10; i++) {
  3. if (i == 4) {
  4. break;
  5. }
  6. printf("%d\n", i);
  7. }

i 等于 4 时跳出循环

  1. int i;
  2. for (i = 0; i < 10; i++) {
  3. if (i == 4) {
  4. continue;
  5. }
  6. printf("%d\n", i);
  7. }

示例跳过 4 的值

While Break 示例

  1. int i = 0;
  2. while (i < 10) {
  3. if (i == 4) {
  4. break;
  5. }
  6. printf("%d\n", i);
  7. i++;
  8. }

While continue 示例

  1. int i = 0;
  2. while (i < 10) {
  3. i++;
  4. if (i == 4) {
  5. continue;
  6. }
  7. printf("%d\n", i);
  8. }

数组 Arrays

  1. int myNumbers[] = {25, 50, 75, 100};
  2. printf("%d", myNumbers[0]);
  3. // 输出 25

更改数组元素

  1. int myNumbers[] = {25, 50, 75, 100};
  2. myNumbers[0] = 33;
  3. printf("%d", myNumbers[0]);

循环遍历数组

  1. int myNumbers[] = {25, 50, 75, 100};
  2. int i;
  3. for (i = 0; i < 4; i++) {
  4. printf("%d\n", myNumbers[i]);
  5. }

设置数组大小

  1. // 声明一个由四个整数组成的数组:
  2. int myNumbers[4];
  3. // 添加元素
  4. myNumbers[0] = 25;
  5. myNumbers[1] = 50;
  6. myNumbers[2] = 75;
  7. myNumbers[3] = 100;

枚举 Enum

  1. enum week { Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun };

定义枚举变量

  1. enum week a, b, c;
  2. enum week { Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } a, b, c;

有了枚举变量,就可以把列表中的值赋给它

  1. enum week { Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun };
  2. enum week a = Mon, b = Wed, c = Sat;
  3. // 或者
  4. enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } a = Mon, b = Wed, c = Sat;

枚举示例应用

  1. enum week {Mon = 1, Tues, Wed, Thurs} day;
  2. scanf("%d", &day);
  3. switch(day){
  4. case Mon: puts("Monday"); break;
  5. case Tues: puts("Tuesday"); break;
  6. case Wed: puts("Wednesday"); break;
  7. case Thurs: puts("Thursday"); break;
  8. default: puts("Error!");
  9. }

用户输入

  1. // 创建一个整数变量来存储我们从用户那里得到的数字
  2. int myNum;
  3. // 要求用户输入一个数字
  4. printf("请输入一个数字: \n");
  5. // 获取并保存用户输入的号码
  6. scanf("%d", &myNum);
  7. // 输出用户输入的数字
  8. printf("您输入的数字: %d", myNum);

用户输入字符串

  1. // 创建一个字符串
  2. char firstName[30];
  3. // 要求用户输入一些文本
  4. printf("输入您的名字: \n");
  5. // 获取并保存文本
  6. scanf("%s", firstName);
  7. // 输出文本
  8. printf("Hello %s.", firstName);

内存地址

创建变量时,会为该变量分配一个内存地址

  1. int myAge = 43;
  2. printf("%p", &myAge);
  3. // 输出:0x7ffe5367e044

要访问它,请使用引用运算符 (&)

创建指针

  1. int myAge = 43; // 一个 int 变量
  2. printf("%d", myAge); // 输出 myAge(43)的值
  3. // 输出 myAge 的内存地址(0x7ffe5367e044)
  4. printf("%p", &myAge);

指针变量

  1. int myAge = 43; // 一个 int 变量
  2. int* ptr = &myAge; // 名为 ptr 的指针变量,用于存储 myAge 的地址
  3. printf("%d\n", myAge); // 输出 myAge (43) 的值
  4. printf("%p\n", \&myAge); // 输出 myAge 的内存地址(0x7ffe5367e044)
  5. printf("%p\n", ptr); // 用指针(0x7ffe5367e044)输出myAge的内存地址

取消引用

  1. int myAge = 43; // 变量声明
  2. int* ptr = &myAge; // 指针声明
  3. // 参考:用指针输出 myAge 的
  4. // 内存地址(0x7ffe5367e044)
  5. printf("%p\n", ptr);
  6. // 取消引用:用指针输出 myAge 的值 (43)
  7. printf("%d\n", *ptr);

运算符

算术运算符

  1. int myNum = 100 + 50;
  2. int sum1 = 100 + 50; // 150 (100 + 50)
  3. int sum2 = sum1 + 250; // 400 (150 + 250)
  4. int sum3 = sum2 + sum2; // 800 (400 + 400)

Operator Name Description Example
+ 将两个值相加 x + y
- 从另一个值中减去一个值 x - y
* 将两个值相乘 x * y
/ 将一个值除以另一个 x / y
% 取模 返回除法余数 x % y
++ 增量 将变量的值增加 1 ++
-- 乘量 将变量的值减 1 --x

赋值运算符

符号 示例 如同
= x = 5 x = 5
+= x += 3 x = x + 3
-= x -= 3 x = x - 3
*= x *= 3 x = x * 3
/= x /= 3 x = x / 3
%= x %= 3 x = x % 3
&= x &= 3 x = x & 3
`\ =` x `\ =` 3 x = x `\ ` 3
^= x ^= 3 x = x ^ 3
>>= x >>= 3 x = x >> 3
<<= x <<= 3 x = x << 3

比较运算符

  1. int x = 5;
  2. int y = 3;
  3. printf("%d", x > y);
  4. // 返回 1(真),因为 5 大于 3

符号 名称 示例
== 等于 x == y
!= 不等于 x != y
> 大于 x > y
< 小于 x < y
>= 大于或等于 x >= y
<= 小于或等于 x <= y

比较运算符用于比较两个值

逻辑运算符

符号 名称 说明 示例
&& 逻辑 如果两个语句都为真,则返回真 x < 5 && x < 10
`\ \ ` 逻辑 如果其中一个语句为真,则返回真 `x < 5 \ \ x < 4`
! 逻辑 反转结果,如果结果为真则返回假 !(x < 5 && x < 10)

运算符示例

  1. unsigned int a = 60; /* 60 = 0011 1100 */
  2. unsigned int b = 13; /* 13 = 0000 1101 */
  3. int c = 0;
  4. c = a & b; /* 12 = 0000 1100 */
  5. printf("Line 1 - c 的值是 %d\n", c );
  6. c = a | b; /* 61 = 0011 1101 */
  7. printf("Line 2 - c 的值是 %d\n", c );
  8. c = a ^ b; /* 49 = 0011 0001 */
  9. printf("Line 3 - c 的值是 %d\n", c );
  10. c = ~a; /*-61 = 1100 0011 */
  11. printf("Line 4 - c 的值是 %d\n", c );
  12. c = a << 2; /* 240 = 1111 0000 */
  13. printf("Line 5 - c 的值是 %d\n", c );
  14. c = a >> 2; /* 15 = 0000 1111 */
  15. printf("Line 6 - c 的值是 %d\n", c );

位运算符

运算符 描述 实例
& 按位与操作,按二进制位进行”与”运算 (A & B) 将得到 12 即为 0000 1100
`\ ` 按位或运算符,按二进制位进行”或”运算 `(A \ B)将得到61` 即为 0011 1101
^ 异或运算符,按二进制位进行”异或”运算 (A ^ B) 将得到 49 即为 0011 0001
~ 取反运算符,按二进制位进行”取反”运算 (~A) 将得到 -61 即为 1100 0011
<< 二进制左移运算符 A << 2 将得到 240 即为 1111 0000
>> 二进制右移运算符 A >> 2 将得到 15 即为 0000 1111

数据类型 Data Types

基本数据类型

数据类型 大小 Size 范围 Range 描述 Description
char 1 字节 −128 ~ 127 单个字符/字母/数字/ASCII
signed char 1 字节 −128 ~ 127 -
unsigned char 1 字节 0 ~ 255 -
int 24 字节 −32,768 ~ 32,767 存储整数
signed int 2 字节 −32,768 ~ 32,767
unsigned int 2 字节 0 ~ 65,535
short int 2 字节 −32,768 ~ 32,767
signed short int 2 字节 −32,768 ~ 32,767
unsigned short int 2 字节 0 ~ 65,535
long int 4 字节 -2,147,483,648 ~ 2,147,483,647
signed long int 4 字节 -2,147,483,648 ~ 2,147,483,647
unsigned long int 4 字节 0 ~ 4,294,967,295
float 4 字节
double 8 字节
long double 10 字节

数据类型

  1. // 创建变量
  2. int myNum = 5; // 整数
  3. float myFloatNum = 5.99; // 浮点数
  4. char myLetter = 'D'; // 字符串
  5. // 高精度浮点数据或数字
  6. double myDouble = 3.2325467;
  7. // 打印输出变量
  8. printf("%d\n", myNum);
  9. printf("%f\n", myFloatNum);
  10. printf("%c\n", myLetter);
  11. printf("%lf\n", myDouble);

数据类型 说 明
char 字符型
short 短整型
int 整型
long 长整型
float 单精度浮点型
double 双精度浮点型
void 无类型

基本格式说明符

格式说明符 数据类型
%d%i int 整数
%f float 单精度的十进制类型
%lf double 高精度浮点数据或数字
%c char 字符
%s 用于 strings 字符串

基本格式说明符

short int long
8 进制 %ho %o %lo
10 进制 %hd %d %ld
16 进制 %hx / %hX %x / %X %lx / %lX

数据格式示例

  1. int myNum = 5;
  2. float myFloatNum = 5.99; // 浮点数
  3. char myLetter = 'D'; // 字符串
  4. // 打印输出变量
  5. printf("%d\n", myNum);
  6. printf("%f\n", myFloatNum);
  7. printf("%c\n", myLetter);

预处理器

预处理器指令

指令 描述
#define 定义宏
#include 包含一个源代码文件
#undef 取消已定义的宏
#ifdef 如果宏已经定义,则返回真
#ifndef 如果宏没有定义,则返回真
#if 如果给定条件为真,则编译下面代码
#else #if 的替代方案
#elif 如果 #if 条件为假,当前条件为
#endif 结束一个 #if……#else 条件编译块
#error 当遇到标准错误时,输出错误消息
#pragma 使用标准化方法,向编译器发布特殊的命令到编译器中
  1. // 所有的 MAX_ARRAY_LENGTH 替换为 20
  2. #define MAX_ARRAY_LENGTH 20
  3. // 系统库中获取 stdio.h
  4. #include <stdio.h>
  5. // 本地目录中获取 myheader.h
  6. #include "myheader.h"
  7. #undef FILE_SIZE
  8. #define FILE_SIZE 42 // 取消已定义并定义为 42

预定义宏

描述
__DATE__ 当前日期,一个以 “MMM DD YYYY” 格式表示的字符常量
__TIME__ 当前时间,一个以 “HH:MM:SS” 格式表示的字符常量
__FILE__ 这会包含当前文件名,一个字符串常量
__LINE__ 这会包含当前行号,一个十进制常量
__STDC__ 当编译器以 ANSI 标准编译时,则定义为 1

ANSI C 定义了许多宏,您可以使用这些宏,但是不能直接修改这些预定义的宏

预定义宏示例

  1. #include <stdio.h>
  2. int main() {
  3. printf("File :%s\n", __FILE__);
  4. printf("Date :%s\n", __DATE__);
  5. printf("Time :%s\n", __TIME__);
  6. printf("Line :%d\n", __LINE__);
  7. printf("ANSI :%d\n", __STDC__);
  8. }

宏延续运算符(\)

一个宏通常写在一个单行上。

  1. #define message_for(a, b) \
  2. printf(#a " 和 " #b ": 我们爱你!\n")

如果宏太长,一个单行容纳不下,则使用宏延续运算符 \

字符串常量化运算符(#)

  1. #include <stdio.h>
  2. #define message_for(a, b) \
  3. printf(#a " 和 " #b ": 我们爱你!\n")
  4. int main(void) {
  5. message_for(Carole, Debra);
  6. return 0;
  7. }

当上面的代码被编译和执行时,它会产生下列结果:

  1. Carole Debra: 我们爱你!

需要把一个宏的参数转换为字符串常量时,使用字符串常量化运算符 #

标记粘贴运算符(##)

  1. #include <stdio.h>
  2. #define tokenpaster(n) printf ("token" #n " = %d", token##n)
  3. int main(void){
  4. int token34 = 40;
  5. tokenpaster(34);
  6. return 0;
  7. }

defined() 运算符

  1. #include <stdio.h>
  2. #if !defined (MESSAGE)
  3. #define MESSAGE "You wish!"
  4. #endif
  5. int main(void) {
  6. printf("Here is the message: %s\n", MESSAGE);
  7. return 0;
  8. }

参数化的宏

  1. int square(int x) {
  2. return x * x;
  3. }

宏重写上面的代码,如下:

  1. #define square(x) ((x) * (x))

宏名称和左圆括号之间不允许有空格

  1. #include <stdio.h>
  2. #define MAX(x,y) ((x) > (y) ? (x) : (y))
  3. int main(void) {
  4. printf("Max between 20 and 10 is %d\n", MAX(10, 20));
  5. return 0;
  6. }

函数

函数声明和定义

  1. int main() {
  2. printf("Hello World!");
  3. return 0;
  4. }

函数由两部分组成

  1. void myFunction() { // 声明 declaration
  2. // 函数体(要执行的代码)(definition)
  3. }

  • Declaration 声明函数名称、返回类型和参数 (如果有)
  • Definition 函数体 (要执行的代码)

  1. // 函数声明
  2. void myFunction();
  3. // 主要方法
  4. int main() {
  5. myFunction(); // --> 调用函数
  6. return 0;
  7. }
  8. void myFunction() {// 函数定义
  9. printf("晚上好!");
  10. }

调用函数

  1. // 创建函数
  2. void myFunction() {
  3. printf("晚上好!");
  4. }
  5. int main() {
  6. myFunction(); // 调用函数
  7. myFunction(); // 可以被多次调用
  8. return 0;
  9. }
  10. // 输出 -> "晚上好!"
  11. // 输出 -> "晚上好!"

函数参数

  1. void myFunction(char name[]) {
  2. printf("Hello %s\n", name);
  3. }
  4. int main() {
  5. myFunction("Liam");
  6. myFunction("Jenny");
  7. return 0;
  8. }
  9. // Hello Liam
  10. // Hello Jenny

多个参数

  1. void myFunction(char name[], int age) {
  2. printf("你好 %s 你 %d 岁了。\n",name,age);
  3. }
  4. int main() {
  5. myFunction("Liam", 3);
  6. myFunction("Jenny", 14);
  7. return 0;
  8. }
  9. // 你好 Liam 你 3 岁了。
  10. // 你好 Jenny 你 14 岁了。

返回值

  1. int myFunction(int x) {
  2. return 5 + x;
  3. }
  4. int main() {
  5. printf("结果: %d", myFunction(3));
  6. return 0;
  7. }
  8. // 输出 8 (5 + 3)

两个参数

  1. int myFunction(int x, int y) {
  2. return x + y;
  3. }
  4. int main() {
  5. printf("结果: %d", myFunction(5, 3));
  6. // 将结果存储在变量中
  7. int result = myFunction(5, 3);
  8. printf("结果 = %d", result);
  9. return 0;
  10. }
  11. // 结果: 8 (5 + 3)
  12. // 结果 = 8 (5 + 3)

递归示例

  1. int sum(int k);
  2. int main() {
  3. int result = sum(10);
  4. printf("%d", result);
  5. return 0;
  6. }
  7. int sum(int k) {
  8. if (k > 0) {
  9. return k + sum(k - 1);
  10. } else {
  11. return 0;
  12. }
  13. }

数学函数

  1. #include <math.h>
  2. printf("%f", sqrt(16)); // 平方根
  3. printf("%f", ceil(1.4)); // 四舍五入 (入)
  4. printf("%f", floor(1.4)); // 四舍五入 (舍)
  5. printf("%f", pow(4, 3)); // x(4)的y(3)次方

  • abs(x) 绝对值
  • acos(x) 反余弦值
  • asin(x) 反正弦值
  • atan(x) 反正切
  • cbrt(x) 立方根
  • cos(x) 余弦
  • exp(x) Ex 的值
  • sin(x) x 的正弦值
  • tan(x) 角度的正切

Structures 结构

创建结构

  1. struct MyStructure { // 结构声明
  2. int myNum; // 成员(int 变量)
  3. char myLetter; // 成员(char 变量)
  4. }; // 用分号结束结构

创建一个名为 s1 的结构变量

```c {7} struct myStructure { int myNum; char myLetter; };

int main() { struct myStructure s1; return 0; }

  1. ### 结构中的字符串
  2. ```c {9}
  3. struct myStructure {
  4. int myNum;
  5. char myLetter;
  6. char myString[30]; // String
  7. };
  8. int main() {
  9. struct myStructure s1;
  10. strcpy(s1.myString, "Some text");
  11. // 打印值
  12. printf("我字符串: %s", s1.myString);
  13. return 0;
  14. }

使用 strcpy 函数为字符串赋值

访问结构成员

```c {11,12,16} // 创建一个名为 myStructure 的结构 struct myStructure { int myNum; char myLetter; };

int main() { // 创建一个名为 s1 的 myStructure 结构变量 struct myStructure s1; // 为 s1 的成员赋值 s1.myNum = 13; s1.myLetter = ‘B’;

// 创建一个名为 s2 的 myStructure 结构变量 // 并为其赋值 struct myStructure s2 = {13, ‘B’}; // 打印值 printf(“My number: %d\n”, s1.myNum); printf(“My letter: %c\n”, s1.myLetter); return 0; }

  1. 创建不同的结构变量
  2. ```c
  3. struct myStructure s1;
  4. struct myStructure s2;
  5. // 为不同的结构变量赋值
  6. s1.myNum = 13;
  7. s1.myLetter = 'B';
  8. s2.myNum = 20;
  9. s2.myLetter = 'C';

复制结构

```c {6} struct myStructure s1 = { 13, ‘B’, “Some text” };

struct myStructure s2; s2 = s1;

  1. 示例中,将 `s1` 的值复制到 `s2`
  2. ### 修改值
  3. ```c {6,7}
  4. // 创建一个结构变量并为其赋值
  5. struct myStructure s1 = {
  6. 13, 'B'
  7. };
  8. // 修改值
  9. s1.myNum = 30;
  10. s1.myLetter = 'C';
  11. // 打印值
  12. printf("%d %c %s",
  13. s1.myNum,
  14. s1.myLetter);

文件处理

文件处理函数

函数 描述 Description
fopen() 打开新文件或现有文件
fprintf() 将数据写入文件
fscanf() 从文件中读取数据
fputc() 将一个字符写入文件
fgetc() 从文件中读取一个字符
fclose() 关闭文件
fseek() 将文件指针设置到给定位置
fputw() 将整数写入文件
fgetw() 从文件中读取一个整数
ftell() 返回当前位置
rewind() 将文件指针设置为文件的开头

C 库中有许多函数可以打开/读取/写入/搜索关闭文件

打开模式参数

模式 Mode 描述 Description
r 读取模式打开一个文本文件,允许读取文件
w 模式打开一个文本文件,允许写入文件
a 追加模式打开一个文本文件
如果文件不存在,则会创建一个新文件
r+ 读写模式打开一个文本文件,允许读写文件
w+ 读写模式打开一个文本文件,允许读写文件
a+ 读写模式打开一个文本文件,允许读写文件
rb 读取模式打开二进制文件
wb 写入模式打开二进制文件
ab 追加模式打开二进制文件
rb+ 读写模式打开二进制文件
wb+ 读写模式打开二进制文件
ab+ 读写模式打开二进制文件

打开文件:fopen()

```c {6}

include

void main( ) { FILE *fp; char ch; fp = fopen(“file_handle.c”, “r”);

while (1) { ch = fgetc(fp); if (ch == EOF) break; printf(“%c”, ch); } fclose(fp); }

  1. 对文件执行所有操作后,必须关闭 `fclose()` 该文件
  2. ### 写入文件:fprintf()
  3. ```c {7}
  4. #include <stdio.h>
  5. main() {
  6. FILE *fp;
  7. fp = fopen("file.txt", "w"); // 打开文件
  8. // 将数据写入文件
  9. fprintf(fp, "fprintf 的 Hello 文件..\n");
  10. fclose(fp); // 关闭文件
  11. }

读取文件:fscanf()

```c {6}

include

main(){ FILE *fp; char buff[255]; // 创建char数组存储文件数据 fp = fopen(“file.txt”, “r”); while(fscanf(fp, “%s”, buff)!=EOF) { printf(“%s “, buff); } fclose(fp); }

  1. ### 写入文件:fputc()
  2. ```c {6}
  3. #include <stdio.h>
  4. main(){
  5. FILE *fp;
  6. fp = fopen("file1.txt", "w"); // 打开文件
  7. fputc('a',fp); // 将单个字符写入文件
  8. fclose(fp); // 关闭文件
  9. }

读取文件:fgetc()

```c {8}

include

include

void main() { FILE *fp; char c; clrscr(); fp=fopen(“myfile.txt”, “r”); while((c=fgetc(fp))!=EOF){ printf(“%c”, c); } fclose(fp); getch(); }

  1. ### 写入文件:fputs()
  2. ```c {8}
  3. #include<stdio.h>
  4. #include<conio.h>
  5. void main(){
  6. FILE *fp;
  7. clrscr();
  8. fp = fopen("myfile2.txt","w");
  9. fputs("hello c programming",fp);
  10. fclose(fp);
  11. getch();
  12. }

读取文件:fgets()

```c {10}

include

include

void main() { FILE *fp; char text[300]; clrscr();

fp=fopen(“myfile2.txt”, “r”); printf(“%s”, fgets(text, 200, fp)); fclose(fp); getch(); }

  1. ### fseek()
  2. ```c {8}
  3. #include <stdio.h>
  4. void main(){
  5. FILE *fp;
  6. fp = fopen("myfile.txt","w+");
  7. fputs("This is Book", fp);
  8. // 将文件指针设置到给定位置
  9. fseek(fp, 7, SEEK_SET);
  10. fputs("Kenny Wong", fp);
  11. fclose(fp);
  12. }

将文件指针设置到给定位置

rewind()

```c {11}

include

include

void main(){ FILE *fp; char c; clrscr(); fp=fopen(“file.txt”, “r”); while((c=fgetc(fp)) != EOF){ printf(“%c”, c); } rewind(fp); // 将文件指针移动到文件的开头 while((c=fgetc(fp)) != EOF){ printf(“%c”, c); } fclose(fp); getch(); } // 输出 // Hello World!Hello World!

  1. ### ftell()
  2. ```c {11}
  3. #include <stdio.h>
  4. #include <conio.h>
  5. void main (){
  6. FILE *fp;
  7. int length;
  8. clrscr();
  9. fp = fopen("file.txt", "r");
  10. fseek(fp, 0, SEEK_END);
  11. length = ftell(fp); // 返回当前位置
  12. fclose(fp);
  13. printf("文件大小: %d bytes", length);
  14. getch();
  15. }
  16. // 输出
  17. // 文件大小: 18 bytes

杂项

Docker 运行环境

  • 安装 Docker
  • 创建 Dockerfile 文件
    1. FROM alpine:3.14
    2. RUN apk add --no-cache gcc musl-dev
    3. RUN apk add --no-cache g++
  • 生成本地 myalpine 镜像
    1. docker build -t myalpine .
  • 运行映像,把当前路径 ($PWD) 映射至容器的 /test 目录,用 gcc 编译程序,exit返回
    1. docker run -it -v $PWD:/test myalpine
    2. root@b1a38bd7107a:/# cd test
    3. root@b1a38bd7107a:/test# gcc -o hello hello.c
    4. Hello World
    5. root@b1a38bd7107a:/test# exit
    6. exit

另见