备战计算机二级 C 语言知识点(四)

目录

位运算

文件操作


位运算

1. 位运算符的含义和使用。

位运算符是一种用于在二进制数的位级别上执行操作的运算符。它们直接对二进制数的位进行操作,可以用于进行位的移动、与、或、异或等操作。

以下是常见的位运算符及其含义和使用方法:

  1. 按位与(&):对两个二进制数的对应位进行逻辑与操作,相同位上同时为1才会得到1,否则为0。
  • 示例:
    10 & 6
    // 二进制:   1010
    //           0110
    // 结果:     0010 (2)
    

  1. 按位或(|):对两个二进制数的对应位进行逻辑或操作,相同位上只要有一个为1就会得到1,否则为0。
  • 示例:
    10 | 6
    // 二进制:   1010
    //           0110
    // 结果:     1110 (14)
    

  1. 按位异或(^):对两个二进制数的对应位进行逻辑异或操作,相同位上相异时为1,相同时为0。
  • 示例:
    10 ^ 6
    // 二进制:   1010
    //           0110
    // 结果:     1100 (12)
    

  1. 按位取反(~):对一个二进制数进行逻辑非操作,将所有位取反。
  • 示例:
    ~10
    // 二进制:   1010
    // 结果:     0101 (-11)
    

  1. 左移(<<):将一个二进制数的所有位向左移动指定的位数,右侧用0填充。
  • 示例:
    10 << 2
    // 二进制:   1010
    // 结果:    101000 (40)
    

  1. 右移(>>):将一个二进制数的所有位向右移动指定的位数,左侧用符号位(正数为0,负数为1)或0填充。
  • 示例:
    -10 >> 2
    // 二进制:   11111111111111111111111111110110
    // 结果:     11111111111111111111111111111101 (-3)
    

这些位运算符可用于对整数进行位级别的操作,例如执行位计算、提取特定位、设置特定位等操作。它们在底层系统编程、位掩码、图像处理等领域中有广泛应用。

请注意,在使用位运算符时,要特别注意数据类型和位数的限制,以避免出现意外的结果或溢出。此外,位运算符的优先级较低,需要结合其他运算符使用时,请适当使用括号来明确优先级。

2. 简单的位运算。

以下是一些常见的 C 语言位运算示例:

  1. 检查一个整数的奇偶性:
int num = 10;
if (num & 1) {
    printf("%d 是奇数\n", num);
} else {
    printf("%d 是偶数\n", num);
}

此示例使用按位与运算符 & 检查 num 的最低位,如果结果为 1,则表示 num 是奇数,否则为偶数。

  1. 交换两个变量的值:
int a = 5, b = 10;
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("交换后:a = %d, b = %d\n", a, b);

这里使用异或运算符 ^ 来交换变量 ab 的值,通过异或的特性可以避免使用额外的变量。

  1. 将指定位置的位设置为 1:
unsigned int value = 0b11001100;
int bitPosition = 3;
unsigned int mask = 1 << bitPosition;
value |= mask;
printf("设置指定位置后:0x%X\n", value);

这个示例使用左移运算符 << 创建了一个掩码 mask,然后使用按位或运算符 |mask 应用于 value,将指定位置上的位设置为 1。

  1. 将指定位置的位设置为 0:
unsigned int value = 0b11001111;
int bitPosition = 4;
unsigned int mask = ~(1 << bitPosition);
value &= mask;
printf("清除指定位置后:0x%X\n", value);

这个示例使用左移运算符 << 创建了一个掩码 mask,然后使用按位取反运算符 ~mask 取反,再与 value 进行按位与运算 &,将指定位置上的位设置为 0。

文件操作

1. 文件类型指针(FILE 类型指针)。

在C语言中,FILE类型是一个指向文件对象的结构体指针。它在标准库中定义,并用于处理文件的输入和输出。

使用FILE类型指针可以创建、打开、关闭、读取和写入文件。通过该指针,可以访问文件的属性和数据。

以下是使用FILE类型指针的常见操作:

  1. 打开文件:
FILE *file;
file = fopen("filename.txt", "r");

这个示例中,使用fopen函数打开名为filename.txt的文件,模式为只读("r")。

  1. 关闭文件:
fclose(file);

使用fclose函数关闭已打开的文件,确保完成文件操作后及时关闭。

  1. 读取文件内容:
int ch;
while ((ch = fgetc(file)) != EOF) {
    putchar(ch); // 输出字符到控制台
}

使用fgetc函数从文件中逐个读取字符,直到达到文件末尾(EOF)。

  1. 写入文件内容:
fprintf(file, "Hello, world!\n");

使用fprintf函数将格式化的字符串写入文件。

  1. 检查文件是否成功打开:
if (file == NULL) {
    printf("无法打开文件\n");
}

在打开文件失败时,fopen函数将返回NULL,可以通过检查FILE指针是否为NULL来判断文件是否成功打开。

这些只是FILE类型指针的基本操作示例,还有其他更高级的文件操作函数可供使用,如fgetsfputsfwritefread等。

在进行文件操作时,请确保遵守文件的操作权限、关闭文件以释放资源,并进行错误处理以应对可能发生的异常情况。

2. 文件的打开与关闭(fopen,fclose)。

在 C 语言中,通过使用 fopen 函数打开文件,并使用 fclose 函数关闭文件。下面是关于这两个函数的详细说明:

  1. 打开文件(fopen):

    FILE *fopen(const char *filename, const char *mode);
    

    fopen 函数用于打开文件,并返回一个指向 FILE 结构体的指针。它接受两个参数:文件名和打开模式。

    • filename:一个字符串,表示要打开的文件的名称或路径。
    • mode:一个字符串,指定文件的打开模式。常见的打开模式包括:
      • "r":只读模式。打开一个已存在的文件进行读取。
      • "w":写入模式。若文件存在,则清空内容;若文件不存在,则创建新文件。
      • "a":追加模式。若文件存在,则在文件末尾追加内容;若文件不存在,则创建新文件。
      • "rb""wb""ab":二进制模式打开文件(用于处理二进制文件)。

    fopen 函数将返回一个指向已打开文件的 FILE 结构体指针。若打开文件失败,则返回 NULL

  2. 关闭文件(fclose):

    int fclose(FILE *stream);
    

    fclose 函数用于关闭已打开的文件。它接受一个指向 FILE 结构体的指针作为参数,并返回一个整数值。

    • stream:指向已打开文件的 FILE 结构体指针。

    fclose 函数将关闭文件,并释放与该文件相关的资源。若成功关闭文件,则返回 0;否则返回 EOF

在使用 fopen 打开文件后,应确保在文件使用完毕后调用 fclose 函数来关闭文件,以便释放系统资源,并确保文件操作的正确性和完整性。例如:

#include <stdio.h>

int main() {
    FILE *file = fopen("example.txt", "r");

    if (file == NULL) {
        printf("无法打开文件\n");
        return 1;
    }

    // 进行文件操作...

    fclose(file);
    return 0;
}

在上述示例中,首先尝试以只读模式打开名为 example.txt 的文件。如果打开文件失败(即 fileNULL),将输出错误信息并返回。

然后可以在文件打开成功后进行相应的文件读取或写入操作,最后在程序结束之前调用 fclose 函数来关闭文件。

请注意,在处理文件时,务必妥善处理可能发生的错误情况,以确保文件操作的安全性和可靠性。

3. 文件的读写(fputc,fgetc,fputs,fgets,fread,fwrite,fprintf,fscanf 函数的应用),文件的定位 (rewind,fseek 函数的应用)

文件的读写操作可以使用多个函数来实现,其中包括 fputcfgetcfputsfgetsfreadfwritefprintffscanf 等函数。而文件的定位可以使用 rewindfseek 函数来实现。下面是这些函数的详细说明:

  1. 写入单个字符到文件(fputc):

    int fputc(int ch, FILE *stream);
    

    fputc 函数用于将指定字符 ch 写入到文件流 stream 中。它返回写入的字符,若遇到错误则返回 EOF

  2. 从文件中读取单个字符(fgetc):

    int fgetc(FILE *stream);
    

    .

  3. 写入字符串到文件(fputs):

    int fputs(const char *str, FILE *stream);
    

    fputs 函数把一个以 null 结尾的字符串 str 写入到文件流 stream 中。它返回一个非负整数表示成功写入的字符数,若发生错误则返回 EOF

  4. 从文件中读取一行字符串(fgets):

    char *fgets(char *str, int n, FILE *stream);
    

    fgets 函数从文件流 stream 中读取一行字符串并存储到字符数组 str 中,最多读取 n-1 个字符。若成功读取,则返回 str;若到达文件末尾或遇到错误,则返回 NULL

  5. 从文件中读取/写入数据块(freadfwrite):

    size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
    size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
    

    fread 函数从文件流 stream 中读取 nmemb 个数据块,每个数据块的大小为 size 字节,并将它们存储到指针 ptr 指向的内存区域中。返回值表示实际读取的数据块数量。fwrite 函数将指针 ptr 指向的内存区域中的 nmemb 个数据块,每个数据块的大小为 size 字节,写入到文件流 stream 中。返回值表示实际写入的数据块数量。

  6. 格式化写入到文件(fprintf

    int fprintf(FILE *stream, const char *format, ...);
    

    fprintf 函数将格式化后的字符串按照指定的 format 写入到文件流 stream 中。它返回写入字符的数量。

  7. 格式化从文件读取(fscanf):

    int fscanf(FILE *stream, const char *format, ...);
    

    fscanf 函数从文件流 stream 中按照指定的 format 读取数据并存储到对应的变量中。它返回成功匹配并读取的项目数量。

  8. 文件定位 - 倒回到文件开头(rewind):

    void rewind(FILE *stream);
    

    rewind 函数将文件流 stream 的位置指针重置到文件开头,以便再次读取文件。

  9. 文件定位 - 设置文件位置(fseek):

    int fseek(FILE *stream, long int offset, int whence);
    

  10. fseek 函数设置文件流 stream 的位置。offset 参数表示偏移量,whence 参数定义了偏移相对于何处的位置,可以使用 SEEK_SET(文件开头)、SEEK_CUR(当前位置)和 SEEK_END(文件末尾)。这些函数都是标准库函数,可以在 <stdio.h> 头文件中找到它们的定义。它们提供了不同的方式来进行文件的读写操作和定位。根据具体的需求,选择适当的函数来完成文件操作。请注意,在进行文件操作时,要确保文件已经成功打开,并在完成操作后及时关闭文件,以释放资源和确保数据的完整性和一致性。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

善程序员文

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值