C语言 文件I/O(备查)

news2024/12/23 19:09:21

所有案列 跳转到其他。

文件打开

FILE* fopen(const char *filename, const char *mode);
参数:
	filename:指定要打开的文件名,需要加上路径(相对、绝对路径)
	mode:指定文件的打开模式
返回值:
	成功:返回指向打开文件的文件指针
	失败:返回 NULL

关闭文件

一个进程同时打开的文件数是有限制的,超过最大同时打开文件数,再次调用fopen打开文件会失败。
所以使用完毕后还需要将文件关闭。

int fclose(FILE * stream);
参数:
	stream:接受一个文件指针,用于指定要关闭的文件。它会将缓冲区中的数据写回到文件中,并释放与文件相关的资源。
返回值:返回一个整数值来指示关闭操作的成功与否。
	成功:关闭文件,它会返回0;
	失败:返回非零值

按 字符 读写文件

按 字符 写文件
//fputc是一个C标准库函数,用于将一个字符写入到文件中。
int fputc(int character, FILE *stream);
int putc(int character, FILE *stream);

参数:
	character:要写入的字符,注意这个参数是整形
	stream:文件指针,对应要写入字符的文件
返回值:
	成功:返回写入的字符
	失败:返回 EOF

在标准C库中,putc函数实际上是一个宏,而不是一个真正的函数。可以将其视为fputc函数的别名。因此,它们的功能是相同的。

fputc函数通常用于以字符形式写入文件,特别适用于处理文本文件。

按 字符 读文件
//fgetc是一个C标准库函数,用于从文件中读取一个字符。
int fgetc(FILE *stream);
int getc(FILE *stream);

fgetc函数接受一个文件指针 stream,用于指定要从中读取字符的文件。
它会从文件中读取一个字符,并返回读取的字符(或者在到达文件结尾或发生错误时返回EOF)。

在标准C库中,getc 函数实际上是一个宏,而不是一个真正的函数。可以将其视为fgetc函数的别名。因此,它们的功能是相同的。

fgetc函数通常用于以字符形式读取文件,特别适用于处理文本文件。

按 行 读写文件

按 行 写文件
//fputs是一个C标准库函数,用于将字符串写入文件。
int fputs(const char *string, FILE *stream);

参数:
	string:字符串的指针,表示要写入的内容
	stream:文件指针,用于指定要写入字符的文件
返回值:
	成功:返回一个非负值
	失败:返回EOF
按 行 读文件
//fgets是一个C标准库函数,用于从文件中读取一行字符。
char *fgets(char *string, int size, FILE *stream);

参数:
	string:字符指针,用于存储读取的字符
	size:指定要读取的最大字符数(包括终止符)
	stream:文件指针,用于指定要从中读取字符的文件
返回值:
	成功:返回参数string的首地址
	失败:返回NULL

按 块 读写文件

按 块 写文件
//fwrite是一个C标准库函数,用于以二进制形式将数据写入文件。
size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream);

参数:
	ptr:指向要写入数据的指针
	size:要写入的每个元素的字节数
	count:要写入的元素数量
	stream:文件指针,用于指定要写入数据的文件
返回值:
	成功:返回写入的元素数量,即count的值
	失败:或者返回一个小于count的值

fwrite函数会将指针 ptr 指向的数据写入到文件中。写入的总字节数是size与count相乘的积。

按 块 读文件
//fread是一个C标准库函数,用于从文件中以二进制形式读取数据。
size_t fread(void *ptr, size_t size, size_t count, FILE *stream);

参数:
	ptr:指向用于存储读取数据的缓冲区的指针
	size:每个元素的字节数
	count:要读取的元素数量
	stream:文件指针,用于指定要从中读取数据的文件
返回值:
	成功:返回实际读取的元素数量
	失败:返回的元素数量与count不相等

fread函数会从文件中读取指定数量的元素,每个元素占据size个字节,将它们存储在ptr指向的缓冲区中。

判断 文件末尾

EOF
#define EOF  (-1)

在C语言中,EOF表示文件结束符(end of file)。

在while循环中以EOF作为文件结束标志,这种以EOF作为文件结束标志的文件,必须是文本文件。

在文本文件中,数据都是以字符的ASCII代码值的形式存放。ASCII代码值的范围是0~127,不可能出现-1,因此可以用EOF作为文件结束标志。

当把数据以二进制形式存放到文件中时,就会有-1值的出现,因此不能采用EOF作为二进制文件的结束标志。

为解决这一个问题,ANSI C提供一个feof函数,用于检查文件流的文件结束标志。

feof()

用于检查文件流的文件结束标志。feof 函数既可用以判断二进制文件又可用以判断文本文件。

int feof(FILE *stream);

参数:
	stream:feof函数接受一个文件指针,用于指定要检查的文件流。它会检查文件流的文件结束标志:
返回值:
	返回一个非零值(真):表示已经到文件结尾
	返回0(假):表示没有到文件结尾

文件指针偏移

fseek
//fseek是一个C标准库函数,用于在文件中定位文件指针的位置。
int fseek(FILE *stream, long offset, int whence);

参数:
	stream:文件指针,用于指定要定位的文件
	offset:指定文件指针的偏移量
	whence:指定文件指针的起始位置,它对应的值有三个
		SEEK_SET:表示从文件开始处偏移,偏移量为offset个字节
		SEEK_CUR:表示从当前位置偏移,偏移量为offset个字节
		SEEK_END:表示从文件末尾处偏移,偏移量为offset个字节
返回值:
	成功:返回 0
	失败:返回非零值

注意:fseek函数在二进制文件文本文件中的行为可能有所不同。
1)在文本文件中,由于使用的编码不同,字符和行的长度可以可变,因此将文件指针定位在某个位置可能无法准确找到这个位置。
2)在二进制文件中,fseek函数可以在任意位置准确定位。

rewind
//rewind是一个C标准库函数,它用于将文件指针重新定位到文件的起始位置。
void rewind(FILE *stream);
参数:
stream:是一个文件指针,用于指定要重新定位的文件。
ftell
//ftell是一个C标准库函数,用于获取文件指针的当前位置(偏移量)。
long ftell(FILE *stream);

参数:
	stream:文件指针,用于指定要获取当前位置的文件。
返回值:
	成功:表示文件指针相对于文件起始位置的偏移量。
	失败:返回值为负数

需要注意的是,ftell函数返回的偏移量是以字节为单位的相对值。初始位置为0,向文件末尾方向的偏移量为,向文件开始方向的偏移量为

此外,在Linux系统中,还可以使用 ftello 函数来处理大文件(超过2GB)的偏移量。这些函数返回的偏移量类型为 off_t,可以处理更大的文件。

将文件指针移动到文件的头部
fseek(fp, 0, SEEK_END);   // 文件指针移动到文件尾部
fseek(fp, 0, SEEK_SET);   // 文件指针移动到文件头部
rewind(fp);               // 文件指针移动到文件头部

文件缓冲区

fflush
//fflush是一个C标准库函数,用于将输出缓冲区的内容立即写入文件。
int fflush(FILE *stream);

参数:
	stream :文件指针
返回值:
	成功:返回0
	失败:返回非零值

fflush函数接受一个文件指针 stream 作为参数,用于指定要刷新缓冲区的文件。它会将输出缓冲区中的内容强制写入文件,并清空缓冲区。

fflush函数接受一个文件指针 stream 作为参数,用于指定要刷新缓冲区的文件。它会将输出缓冲区中的内容强制写入文件,并清空缓冲区。

使用fflush函数可以确保数据被及时写入文件,而不是在程序结束时或者缓冲区达到一定大小时才写入。这在某些情况下很有用,例如当需要及时查看或共享文件内容时。

fprintf()
//fprintf是一个C标准库函数,用于将格式化的数据写入文件中。
int fprintf(FILE *stream, const char *format, ...);

fprintf函数接受一个文件指针 stream、一个格式化字符串 format 和一系列的可变参数,用于按照指定的格式将数据写入到指定的文件中。

fprintf函数与 printf 函数的用法类似,不同之处在于它将结果输出到指定的文件,而不是标准输出流(stdout)。

删除 / 重命名文件

删除文件
//remove是一个C标准库函数,用于删除文件。
int remove(const char *filename);

参数:
filename:用于指定要删除的文件的路径和名称。
返回值:
成功:返回0
失败:返回非零值

使用remove函数删除文件时需谨慎,因为该操作是不可撤销的。

需要确保拥有足够的权限来删除文件,否则删除操作可能会失败。

重命名文件
//rename是一个C标准库函数,用于重命名文件或将文件移动到另一个位置。
int rename(const char *old_filename, const char *new_filename);

参数:
	old_filename:原始文件名(包括路径)
	new_filename:新文件名(包括路径)
返回值:
	成功:返回0
	失败:返回非零值

使用rename函数重命名文件时需谨慎,因为该操作是不可撤销的。

需要确保有足够的权限来执行重命名操作,并且新文件名不会与现有文件冲突。

//rename函数还可以用于将文件移动到不同的目录中,只需要在新文件名中指定目标文件夹的路径。
rename("file.txt", "new/location/newfile.txt");

这样,就可以将文件 file.txt 移动到 new/location 目录下,并命名为 newfile.txt。但是一定要注意,该函数并不会创建新的目录,也就是说要保证 new/location/ 目录是存在的,移动才能成功。

其他

perror()
//perror是一个C标准库函数,它可以将最后一次发生的错误信息输出到终端。
void perror(const char *str);

perror 函数接受一个字符串参数 str,用于作为错误信息的前缀
它会自动获取最近一次错误的错误码,并将相应的错误描述信息格式化输出到标准错误流(stderr)中。

相对路径 / 绝对路径

在这里插入图片描述

文件打开模式

fopen函数第二个参数mode对应的文件打开模式:

在这里插入图片描述
在这里插入图片描述

三个默认的文件指针

在这里插入图片描述

这些文件指针是预定义的,可以在程序中直接使用,无需手动打开或关闭。它们的文件指针类型是FILE*。

文件指针

在使用文件指针之前,需要先定义一个指向FILE类型的指针变量,用于表示文件指针。FILE类型定义在stdio.h头文件中。

//FILE是系统使用 typedef 定义出来的有关文件信息的一种结构体类型,结构中含有文件名、文件状态和文件当前位置等信息。
typedef struct
{
    short           level;  // 缓冲区"满"或者"空"的程度 
    unsigned        flags;  // 文件状态标志 
    char            fd;     // 文件描述符
    unsigned char   hold;   // 如无缓冲区不读取字符
    short           bsize;  // 缓冲区的大小
    unsigned char* buffer;  // 数据缓冲区的位置 
    unsigned        ar;     // 指针,当前的指向 
    unsigned        istemp; // 临时文件,指示器
    short           token;  // 用于有效性的检查 
}FILE;

//进行文件操作的时候,定义文件指针的方式如下
FILE *filePointer;
磁盘文件分类

在这里插入图片描述

文本文件在许多领域中都有着广泛的应用,如日志文件、配置文件、源代码文件、文档、电子邮件等。它是人与计算机之间常用的信息交流和数据存储方式之一。

二进制文件在许多应用中扮演着重要的角色,如可执行文件、图像文件、音频文件、视频文件、数据库文件等。它们提供了一种灵活、高效的方式来存储和处理大量的非文本数据,为各种应用程序和领域提供了丰富的功能和性能。

常见的字符编码

在这里插入图片描述

按字符 读写文件 案列
//按字符写文件
#include <stdio.h>
#include <string.h>

int main()
{
    char* buf = "One world one dream!";
    FILE* fp = fopen("example.txt", "w");
    if (fp == NULL) 
    {
        printf("Failed to open the file.\n");
        return 1;
    }

    int len = strlen(buf);
    for (int i = 0; i < len; ++i)
    {
        int ch = fputc(buf[i], fp);
        printf("%c", ch);
    }
    printf("\n");
    fclose(fp);

    return 0;
}
//按字符 读文件
#include <stdio.h>

int main() 
{
    FILE* fp = fopen("example.txt", "r");
    if (fp == NULL) 
    {
        printf("Failed to open the file.\n");
        return 1;
    }

    char ch;
    while ((ch = fgetc(fp)) != EOF)
    {
        printf("%c", ch);
    }
    printf("\n");
    fclose(fp);

    return 0;
}
按行 读写文件 案列
//按行 写文件
#include <stdio.h>

int main() 
{
    const char* string = "Hello, world!";
    FILE* fp = fopen("example.txt", "w");
    if (fp == NULL) 
    {
        printf("Failed to open the file.\n");
        return -1;
    }

    if (fputs(string, fp) == EOF) 
    {
        printf("Failed to write the string.\n");
        return -1;
    }
    fclose(fp);

    return 0;
}
//按行 读文件
#include <stdio.h>

int main()
{
    char line[100]; // 假设一行最多100个字符

    FILE* fp = fopen("example.txt", "r");
    if (fp == NULL) 
    {
        printf("Failed to open the file.\n");
        return 1;
    }

    while (fgets(line, sizeof(line), fp) != NULL) 
    {
        printf("Read line: %s", line);
    }
    fclose(fp);

    return 0;
}
按块 读写文件 案列
//按块 写文件
#include <stdio.h>
#include <string.h>

struct Person 
{
    char name[20];
    int age;
    double height;
};

int main() 
{
    struct Person person;
    FILE* fp = fopen("example.bin", "wb");
    if (fp == NULL) 
    {
        printf("Failed to open the file.\n");
        return 1;
    }

    strncpy(person.name, "John Doe", sizeof(person.name));
    person.age = 30;
    person.height = 1.8;

    if (fwrite(&person, sizeof(person), 1, fp) != 1) 
    {
        printf("Failed to write the data.\n");
        return 1;
    }
    fclose(fp);

    return 0;
}
//按块 读文件
#include <stdio.h>

struct Person 
{
    char name[20];
    int age;
    double height;
};

int main() 
{
    struct Person person;
    FILE* fp = fopen("example.bin", "rb");
    if (fp == NULL) 
    {
        printf("Failed to open the file.\n");
        return 1;
    }

    if (fread(&person, sizeof(person), 1, fp) != 1) 
    {
        printf("Failed to read the data.\n");
        return 1;
    }

    printf("Name: %s\n", person.name);
    printf("Age: %d\n", person.age);
    printf("Height: %f\n", person.height);
    fclose(fp);

    return 0;
}

需要注意的是,fread函数是以二进制形式读取数据,因此在写入数据时,也需要以二进制方式写入,使用fwrite函数来写入相应的数据。

使用 feo f函数检查文件的结束标志 案列
#include <stdio.h>

int main() 
{
    FILE* fp = fopen("example.txt", "r");
    if (fp == NULL) 
    {
        printf("Failed to open the file.\n");
        return 1;
    }

    char ch;
    while ((ch = fgetc(fp)))
    {
        if (feof(fp)) 
        {
            printf("\nReached end of file.\n");
            break;
        }
        printf("%c", ch);
    }
    printf("\n");
    fclose(fp);

    return 0;
}
文件缓冲区 案列
// 使用fflush函数将输出缓冲区的内容立即写入文件
#include <stdio.h>

int main() 
{
    FILE* fp = fopen("example.txt", "w");
    if (fp == NULL)
    {
        perror("fopen");
        return 1;
    }

    fprintf(fp, "Hello, World!");
    if (fflush(fp) != 0)
    {
        printf("Failed to flush the output buffer.\n");
        return 1;
    }
    fclose(fp);

    return 0;
}
文件指针偏移 案列
//使用fseek函数来定位文件指针的位置
#include <stdio.h>

int main() 
{
    FILE* fp = fopen("example.txt", "rb");
    if (fp == NULL) 
    {
        printf("Failed to open the file.\n");
        return 1;
    }

    char buf[1024] = { 0 };
    fseek(fp, 10, SEEK_SET); 
    fread(buf, 1, sizeof(buf), fp);
    printf("从头部偏移10字节开始读数据, 内容是: %s\n", buf);

    // rewind(fp);
    fseek(fp, 0, SEEK_SET);  
    fread(buf, 1, sizeof(buf), fp);
    printf("从头部开始读数据, 内容是: %s\n", buf);

    fclose(fp);

    return 0;
}
//使用ftell函数获取文件指针的当前位置
#include <stdio.h>

int main() 
{
    long position;
    FILE* fp = fopen("example.txt", "r");
    if (fp == NULL) 
    {
        printf("Failed to open the file.\n");
        return 1;
    }

    position = ftell(fp);
    if (position < 0) 
    {
        printf("Failed to get the current position.\n");
        return 1;
    }
    printf("Current position: %ld\n", position);

    fseek(fp, 15, SEEK_SET);
    position = ftell(fp);
    printf("Current position: %ld\n", position);

    fclose(fp);

    return 0;
}
删除 / 重命名文件 案列
//使用remove函数删除文件
#include <stdio.h>

int main() 
{
    if (remove("example.txt") != 0) 
    {
        printf("Failed to delete the file.\n");
        return 1;
    }
    printf("File deleted successfully.\n");

    return 0;
}
//使用rename函数重命名文件
#include <stdio.h>

int main() 
{
    if (rename("oldname.txt", "newname.txt") != 0) 
    {
        printf("Failed to rename the file.\n");
        return 1;
    }
    printf("File renamed successfully.\n");

    return 0;
}

详细教程可转(查看案列转)

爱编程的大丙

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1307415.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

3.qml 3D-Node类学习

Node类是在View3D 中的对象基础组件&#xff0c;用于表示3D空间中的对象&#xff0c;类似于Qt Quick 2D场景中的Item&#xff0c;介绍如下所示&#xff1a; 如上图可以看到&#xff0c;Node类的子类非常多&#xff0c;比如Model类(显示3D模型)、ParticleSystem3D粒子系统类、Li…

linux 内核同步互斥技术之原子变量

原子变量用来实现对整数的互斥访问&#xff0c;通常用来实现计数器。 例如&#xff0c;我们写一行代码把变量 a 加 1&#xff0c;编译器把代码编译成 3 条汇编指令。 &#xff08;1&#xff09;把变量 a 从内存加载到寄存器。 &#xff08;2&#xff09;把寄存器的值加 1。 &am…

smartKettle离线部署及问题记录

目录 &#x1f4da;第一章 前言&#x1f4d7;背景&#x1f4d7;目的&#x1f4d7;总体方向 &#x1f4da;第二章 部署&#x1f4d7;源码下载&#x1f4d7;后端部署&#x1f4d5;导入后端项目&#x1f4d5;修改settings.xml(自动下载相关jar包)&#x1f4d5; 编译&#x1f4d5; …

【计算机网络】TCP|IP协议

目录 前言 什么是TCP/IP协议&#xff1f; TCP/IP协议的层次结构 TCP/IP协议的工作原理 TCP/IP协议的重要性 结语 前言 TCP/IP协议是当今互联网世界中最重要的网络协议之一&#xff0c;它是网络通信的基石&#xff0c;为数据在网络中的传输提供了可靠性和有效性。本文将深…

比较好的python书籍,python有什么书推荐

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;比较好的python书籍&#xff0c;python有什么书推荐&#xff0c;现在让我们一起来看看吧&#xff01; 我是在半年前接触到Python的&#xff0c;我之前没有一点编程基础&#xff0c;但在我自学的这半年里&#xff0c;我发…

Vue指令之v-on

v-on指令用于注册事件&#xff0c;作用是添加监听与提供事件触发后对应的处理函数。 v-on有两种语法&#xff0c;在提供处理函数的时候既可以直接使用内联语句&#xff0c;也可以提供函数的名字。 第一种语法是直接提供内联语句&#xff0c;如下 v-on:事件名 "内联语句…

数据可视化作用探析

数据可视化是一种将数据转化为图表、图形或其他视觉形式的过程&#xff0c;旨在更直观、更易于理解地展示数据信息。它不仅仅是对数据的简单呈现&#xff0c;更是一种利用视觉化手段帮助人们理解数据、发现模式、分析趋势和做出决策的强大工具。今天&#xff0c;我就从可视化从…

RocketMQ可视化工具 打包遇到的yarn intall 问题

文章目录 RocketMQ可视化工具1.github上下载2.修改参数3.运行4.打包5.出错6.解决7.重试8.再解决9.很奇怪运行没错&#xff0c;但是测试错啦10.不想深究&#xff0c;直接跳过测试11.展示成功 RocketMQ可视化工具 1.github上下载 下载地址 https://github.com/apache/rocketmq-…

在Windows 11中打开任务管理器的7种方法,总有一种很适用

​本文介绍了如何在Windows 11中打开任务管理器。使用Windows任务管理器,你可以跟踪系统进程、监视资源使用情况和强制停止应用程序。 如何使用搜索栏打开任务管理器 在Windows 11中访问任务管理器的一种更简单的方法是使用搜索栏。 1、按Windows键+S或选择任务栏中的“搜索…

Nodejs 第二十二章(脚手架)

编写自己的脚手架 那什么是脚手架&#xff1f; 例如:vue-cli Angular CLI Create React App 编写自己的脚手架是指创建一个定制化的工具&#xff0c;用于快速生成项目的基础结构和代码文件&#xff0c;以及提供一些常用的命令和功能。通过编写自己的脚手架&#xff0c;你可以…

值类型相关函数与对象类型相关函数内存调用过程

值类型相关函数内存调用&#xff1a; 先来看这样一段代码&#xff0c;你认为它的运行结果是多少呢&#xff1f; 20和11还是20和10&#xff1f; package org.example;public class Main {public static void main(String[] args) {int a10;add(a);System.out.println(a);}pub…

【INTEL(ALTERA)】Agilex7 FPGA Development Kit DK-DEV-AGI027R1BES编程/烧录/烧写/下载步骤

DK-DEV-AGI027R1BES 的编程步骤&#xff1a; 将外部 USB Blaster II 连接到 J10- 外部 JTAG 接头。将交换机 SW5.3 设置为 ON&#xff08;首次&#xff09;。打开 英特尔 Quartus Prime Pro Edition 软件编程工具。单击 硬件设置 &#xff0c;然后选择 USB Blaster II。将硬件…

Unity_使用FairyGUI搭建登录页面

Unity_使用FairyGUI搭建登录页面 1. 使用FairyGUI准备一个UI界面&#xff0c;例如&#xff1a;以下登录 2. 发布导出&#xff08;发布路径设置为Unity的Asset下任何路径&#xff09; 3. Unity编辑器安装FairyGUI包资源&#xff08;在资源商店找见并存储为我的资源&#xff0c;…

图片怎么去文字水印?分享三个简单无痕方法

图片怎么去文字水印&#xff1f;大家在遇到好看的图片时&#xff0c;是否曾想过将其用作自己的头像&#xff1f;然而&#xff0c;很多时候从网上保存的图片会带有平台或作者的水印&#xff0c;这会严重影响头像的整体视觉效果&#xff0c;导致我们不得不放弃使用这张图片&#…

typename的两种用法

typename有两种用法&#xff0c;第一种用于声明模板时&#xff0c;表示模板类型参数&#xff0c;如下所示。在用于模板声明时&#xff0c;typename 和 class 等价&#xff0c;具有同等含义。 template<typename T> class MyClass; // 等价于 template<class T> cl…

从零开始学机器学习,这些学习网站让你事半功倍!

介绍&#xff1a;机器学习是人工智能&#xff08;AI&#xff09;和计算机科学的一个分支&#xff0c;它专注于使用数据和算法&#xff0c;模仿人类学习的方式&#xff0c;逐步提高自身的准确性。更具体来说&#xff0c;机器学习是一门关于数据学习的科学技术&#xff0c;它能帮…

Postswigger 靶场 XSS 通关

文章目录 PostSwigger靶场XSS通关学徒&#xff1a;第一关学徒&#xff1a;第二关学徒&#xff1a;第三关学徒&#xff1a;第四关学徒&#xff1a;第五关学徒&#xff1a;第六关学徒&#xff1a;第七关学徒&#xff1a;第八关学徒&#xff1a;第九关 PostSwigger靶场XSS通关 靶…

VCSA7.0加入Windows AD域失败的处理过程

一、问题现象 vcsa7.0加入AD域时提示“Idm client exception: Error trying to join AD, error code 2453” 二、处理过程 &#xff08;一&#xff09;检查是否DNS问题 查看dns是否设置正确&#xff0c;如下&#xff1a; 1. Enable SSH on VCSA. 2. Command> shell 3…

高质量渲染效果的硬件要求!云渲染效果的作用优势

​在数字内容创作的世界里&#xff0c;渲染技术始终是提高视觉效果和最终产物质量的关键环节。无论是影视制作、游戏开发还是建筑可视化&#xff0c;高品质的渲染结果对于传达设计理念和吸引观众都至关重要。本文将讨论实现这些高质量渲染效果所需的硬件要求&#xff0c;探讨CP…

程序中关于时间和比较运算符的单词

时间 在日志中&#xff0c;我们经常碰到关于一些时间的单词缩写 比如这个Fri Dec 1 就代表了Friday &#xff08;星期五&#xff09;&#xff0c; December &#xff08;十二月&#xff09; 12月1日星期五 或者使用date查看时间的时候 dateWed Dec 13 05:55:54 PM CST 2023这…