linux----文件访问(c语言)
linux文件访问相关函数
- 打开文件函数 -
open
- 函数原型:
int open(const char *pathname, int flags, mode_t mode);
- 参数说明:
pathname
:这是要打开的文件的路径名,可以是绝对路径或者相对路径。例如,"/home/user/file.txt"
或者"./data.dat"
。flags
:用于指定打开文件的方式,常见的标志有:O_RDONLY
:以只读方式打开文件。O_WRONLY
:以只写方式打开文件。O_RDWR
:以可读可写方式打开文件。O_CREAT
:如果文件不存在,则创建文件。通常和mode
参数一起使用。O_APPEND
:以追加方式打开文件,写入的数据会添加在文件末尾。
mode
:当使用O_CREAT
标志创建文件时,这个参数用于指定文件的权限。它是一个八进制数,例如0644
表示所有者有读写权限,所属组和其他用户有读权限。
- 返回值:
- 成功时返回一个非负整数,这个整数是文件描述符(File Descriptor)。文件描述符用于后续对文件的读写等操作。例如,
0
、1
、2
分别是标准输入、标准输出和标准错误输出的文件描述符,而新打开的文件描述符通常是大于等于3
的整数。 - 失败时返回
-1
,并且会设置errno
来指示错误原因,常见的错误原因可能是文件不存在、权限不足等。可以通过perror
函数来打印错误信息。
- 成功时返回一个非负整数,这个整数是文件描述符(File Descriptor)。文件描述符用于后续对文件的读写等操作。例如,
- 示例代码:
- 函数原型:
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int main() {int fd;// 以只读方式打开文件,如果文件不存在则返回错误fd = open("test.txt", O_RDONLY);if (fd == -1) {perror("打开文件失败");return 1;}// 在这里可以进行文件的读取操作// 关闭文件if (close(fd) == -1) {perror("关闭文件失败");return 1;}return 0;
}
- 读取文件函数 -
read
- 函数原型:
ssize_t read(int fd, void *buf, size_t count);
- 参数说明:
fd
:这是之前通过open
函数打开文件得到的文件描述符。buf
:这是一个指向缓冲区的指针,用于存储读取到的文件内容。缓冲区的大小应该足够容纳要读取的数据。例如,可以定义一个字符数组char buffer[1024];
来作为缓冲区。count
:这是要读取的字节数。例如,如果count
为10
,则最多读取10
个字节的文件内容。
- 返回值:
- 成功时返回实际读取到的字节数。如果返回值小于
count
,可能是已经到达文件末尾或者被信号中断等原因。例如,返回0
表示已经到达文件末尾。 - 失败时返回
-1
,并且会设置errno
来指示错误原因,常见的错误原因可能是文件描述符无效、权限不足等。
- 成功时返回实际读取到的字节数。如果返回值小于
- 示例代码(续接上面
open
函数的示例):
- 函数原型:
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int main() {int fd;char buffer[1024];ssize_t num_read;// 以只读方式打开文件,如果文件不存在则返回错误fd = open("test.txt", O_RDONLY);if (fd == -1) {perror("打开文件失败");return 1;}// 读取文件内容num_read = read(fd, buffer, sizeof(buffer));if (num_read == -1) {perror("读取文件失败");close(fd);return 1;} else if (num_read == 0) {printf("文件为空。\n");} else {buffer[num_read] = '\0';printf("读取到的内容:%s", buffer);}// 关闭文件if (close(fd) == -1) {perror("关闭文件失败");return 1;}return 0;
}
- 写入文件函数 -
write
- 函数原型:
ssize_t write(int fd, const void *buf, size_t count);
- 参数说明:
fd
:文件描述符,和read
函数中的fd
类似,是通过open
函数打开文件得到的。buf
:这是一个指向包含要写入数据的缓冲区的指针。例如,如果要写入一个字符串,可以定义char data[] = "Hello, World!";
,然后将data
作为buf
参数。count
:这是要写入的字节数。例如,对于上面的字符串data
,count
可以是strlen(data)
。
- 返回值:
- 成功时返回实际写入的字节数。如果返回值小于
count
,可能是磁盘空间不足、被信号中断等原因。 - 失败时返回
-1
,并且会设置errno
来指示错误原因,常见的错误原因可能是文件描述符无效、权限不足等。
- 成功时返回实际写入的字节数。如果返回值小于
- 示例代码(写入一个新文件):
- 函数原型:
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int main() {int fd;char data[] = "这是写入文件的测试内容。";// 以只写方式打开文件,如果文件不存在则创建文件fd = open("new_file.txt", O_WRONLY | O_CREAT, 0644);if (fd == -1) {perror("打开文件失败");return 1;}// 写入文件内容ssize_t num_written = write(fd, data, strlen(data));if (num_written == -1) {perror("写入文件失败");close(fd);return 1;}printf("写入了 %zd 个字节。\n", num_written);// 关闭文件if (close(fd) == -1) {perror("关闭文件失败");return 1;}return 0;
}
- 关闭文件函数 -
close
- 函数原型:
int close(int fd);
- 参数说明:
fd
:这是要关闭的文件的文件描述符,是之前通过open
函数打开文件得到的。
- 返回值:
- 成功时返回
0
。 - 失败时返回
-1
,并且会设置errno
来指示错误原因,常见的错误原因可能是文件描述符无效等。
- 成功时返回
- 重要性:
- 关闭文件是一个重要的操作,它可以释放文件描述符资源,确保数据的完整性。如果不关闭文件,可能会导致文件损坏、资源泄漏等问题。例如,在写入文件后,如果没有正确关闭文件,数据可能没有完全写入磁盘,导致数据丢失。
- 函数原型:
- 文件打开与创建相关函数
- open()函数
- 功能:用于打开或创建文件。它是最基本的文件操作函数之一。
- 参数:
pathname
:文件路径名,如"/home/user/documents/file.txt"
。可以是绝对路径或相对路径。flags
:指定文件打开方式。例如,O_RDONLY
(只读)、O_WRONLY
(只写)、O_RDWR
(读写)。还有其他一些标志,如O_CREAT
(若文件不存在则创建)、O_APPEND
(追加模式打开)等。mode
:当使用O_CREAT
标志时,用于指定新创建文件的权限,如0644
(所有者读写,组和其他用户只读)。
- 返回值:成功返回文件描述符(非负整数),失败返回 - 1,并设置
errno
。
- creat()函数
- 功能:创建一个新文件。它等效于
open(pathname, O_WRONLY|O_CREAT|O_TRUNC, mode)
。 - 参数:
pathname
:文件路径。mode
:文件权限模式。
- 返回值:成功返回文件描述符,失败返回 - 1。不过在现代Linux编程中,
open()
函数使用更广泛,因为它功能更灵活。
- 功能:创建一个新文件。它等效于
- open()函数
- 文件读取相关函数
- read()函数
- 功能:从打开的文件中读取数据。
- 参数:
fd
:文件描述符,由open()
等函数返回。buf
:指向存储读取数据的缓冲区的指针,例如char buffer[1024];
。count
:希望读取的字节数。
- 返回值:成功时返回实际读取的字节数。如果返回0,表示已读到文件末尾;返回 - 1表示出错,同时设置
errno
。
- pread()函数
- 功能:从指定文件偏移量处读取数据,读取操作不会改变文件偏移量。
- 参数:
fd
:文件描述符。buf
:缓冲区指针。count
:读取字节数。offset
:文件中的偏移量,从该位置开始读取。
- 返回值:和
read()
函数类似,成功返回实际读取字节数,0表示文件末尾, - 1表示出错。
- read()函数
- 文件写入相关函数
- write()函数
- 功能:将数据写入打开的文件。
- 参数:
fd
:文件描述符。buf
:指向包含要写入数据的缓冲区的指针。count
:要写入的字节数。
- 返回值:成功时返回实际写入的字节数,可能小于
count
(如磁盘空间不足);返回 - 1表示出错,同时设置errno
。
- pwrite()函数
- 功能:在指定文件偏移量处写入数据,写入操作不会改变文件偏移量。
- 参数:
fd
:文件描述符。buf
:包含要写入数据的缓冲区指针。count
:写入字节数。offset
:文件中的偏移量,在该位置写入。
- 返回值:和
write()
函数类似,成功返回实际写入字节数, - 1表示出错。
- write()函数
- 文件定位相关函数
- lseek()函数
- 功能:移动文件读写指针的位置,用于在文件中随机访问。
- 参数:
fd
:文件描述符。offset
:偏移量,正数表示向文件尾方向移动,负数表示向文件头方向移动。whence
:指定偏移量的相对位置,SEEK_SET
(从文件开头)、SEEK_CUR
(从当前位置)、SEEK_END
(从文件末尾)。
- 返回值:成功返回新的文件偏移量(从文件开头计算的字节数),失败返回 - 1。
- lseek()函数
- 文件属性获取相关函数
- stat()函数
- 功能:获取文件的状态信息,如文件大小、权限、所有者等。
- 参数:
pathname
:文件路径。buf
:指向struct stat
结构体的指针,用于存储文件状态信息。
- 返回值:成功返回0,失败返回 - 1,并设置
errno
。struct stat
结构体包含文件的多种属性,如st_size
(文件大小)、st_mode
(文件权限和类型)等。
- fstat()函数
- 功能:和
stat()
类似,但它获取的是已打开文件(通过文件描述符)的状态信息。 - 参数:
fd
:文件描述符。buf
:指向struct stat
结构体的指针。
- 返回值:成功返回0,失败返回 - 1。
- 功能:和
- stat()函数
- 文件关闭相关函数
- close()函数
- 功能:关闭一个打开的文件,释放文件描述符等资源。
- 参数:
fd
:要关闭的文件的文件描述符。
- 返回值:成功返回0,失败返回 - 1。关闭文件非常重要,不关闭可能导致资源泄漏、数据丢失等问题。
- close()函数
- 目录文件操作相关函数(用于访问目录中的文件)
- opendir()函数
- 功能:打开一个目录,返回一个指向
DIR
结构体的指针,用于后续对目录的操作。 - 参数:
pathname
:目录路径。
- 返回值:成功返回
DIR
结构体指针,失败返回NULL
。
- 功能:打开一个目录,返回一个指向
- readdir()函数
- 功能:读取打开目录中的一个条目(文件或子目录),返回一个指向
struct dirent
结构体的指针,包含条目的名称等信息。 - 参数:
dirp
:opendir()
返回的DIR
结构体指针。
- 返回值:成功返回
struct dirent
结构体指针,若已读完目录或出错则返回NULL
。
- 功能:读取打开目录中的一个条目(文件或子目录),返回一个指向
- closedir()函数
- 功能:关闭之前由
opendir()
打开的目录,释放相关资源。 - 参数:
dirp
:DIR
结构体指针。
- 返回值:成功返回0,失败返回 - 1。
- 功能:关闭之前由
- opendir()函数
以下是上述各Linux文件访问相关函数的代码案例,展示了它们在实际编程中的具体用法:
1. open()
函数示例
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>int main() {int fd;// 尝试以只读方式打开一个已存在的文件fd = open("test.txt", O_RDONLY);if (fd == -1) {perror("打开文件失败");return 1;}printf("成功打开文件,文件描述符为: %d\n", fd);// 关闭文件if (close(fd) == -1) {perror("关闭文件失败");return 1;}return 0;
}
在这个示例中,首先尝试以只读方式打开名为test.txt
的文件,如果打开成功,会打印出获得的文件描述符,最后关闭该文件。
2. creat()
函数示例
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>int main() {int fd;// 使用creat创建一个新文件,权限设置为0644(所有者读写,组和其他用户只读)fd = creat("new_file.txt", 0644);if (fd == -1) {perror("创建文件失败");return 1;}printf("成功创建文件,文件描述符为: %d\n", fd);// 关闭文件if (close(fd) == -1) {perror("关闭文件失败");return 1;}return 0;
}
此代码尝试创建一个名为new_file.txt
的新文件,指定了文件权限为0644
,创建成功后打印文件描述符并关闭文件。
3. read()
函数示例(结合open()
函数使用)
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>#define BUFFER_SIZE 1024int main() {int fd;ssize_t num_read;char buffer[BUFFER_SIZE];// 以只读方式打开文件fd = open("test.txt", O_RDONLY);if (fd == -1) {perror("打开文件失败");return 1;}// 从文件中读取数据到缓冲区num_read = read(fd, buffer, sizeof(buffer));if (num_read == -1) {perror("读取文件失败");close(fd);return 1;} else if (num_read == 0) {printf("文件已读完(到达文件末尾)\n");} else {buffer[num_read] = '\0'; // 添加字符串结束符printf("读取到的内容: %s\n", buffer);}// 关闭文件if (close(fd) == -1) {perror("关闭文件失败");return 1;}return 0;
}
这段代码先打开一个文件,然后使用read
函数从文件中读取数据到定义的缓冲区,根据read
函数的返回值判断读取情况,并做相应处理,最后关闭文件。
4. pread()
函数示例(结合open()
函数使用)
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>#define BUFFER_SIZE 1024int main() {int fd;ssize_t num_read;char buffer[BUFFER_SIZE];off_t offset = 10; // 从文件偏移量为10的位置开始读取// 以只读方式打开文件fd = open("test.txt", O_RDONLY);if (fd == -1) {perror("打开文件失败");return 1;}// 使用pread从指定偏移量处读取数据num_read = pread(fd, buffer, sizeof(buffer), offset);if (num_read == -1) {perror("读取文件失败");close(fd);return 1;} else if (num_read == 0) {printf("已读到文件末尾\n");} else {buffer[num_read] = '\0';printf("从偏移量 %ld 处读取到的内容: %s\n", offset, buffer);}// 关闭文件if (close(fd) == -1) {perror("关闭文件失败");return 1;}return 0;
}
该示例先打开文件,然后利用pread
函数从指定的文件偏移量位置开始读取数据,读取后根据返回值处理数据并关闭文件。
5. write()
函数示例(结合open()
函数使用)
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>#define DATA "这是要写入文件的数据"int main() {int fd;ssize_t num_written;// 以只写方式打开文件,如果文件不存在则创建fd = open("output.txt", O_WRONLY | O_CREAT, 0644);if (fd == -1) {perror("打开文件失败");return 1;}// 将数据写入文件num_written = write(fd, DATA, strlen(DATA));if (num_written == -1) {perror("写入文件失败");close(fd);return 1;}printf("成功写入 %zd 个字节到文件\n", num_written);// 关闭文件if (close(fd) == -1) {perror("关闭文件失败");return 1;}return 0;
}
这里先打开(或创建)一个文件,再使用write
函数将特定的数据写入文件,根据返回值判断写入情况,最后关闭文件。
6. pwrite()
函数示例(结合open()
函数使用)
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>#define DATA "新的数据"
#define OFFSET 20 // 在文件偏移量为20的位置写入数据int main() {int fd;ssize_t num_written;// 以读写方式打开文件fd = open("test_write.txt", O_RDWR);if (fd == -1) {perror("打开文件失败");return 1;}// 使用pwrite在指定偏移量处写入数据num_written = pwrite(fd, DATA, strlen(DATA), OFFSET);if (num_written == -1) {perror("写入文件失败");close(fd);return 1;}printf("成功在偏移量 %d 处写入 %zd 个字节到文件\n", OFFSET, num_written);// 关闭文件if (close(fd) == -1) {perror("关闭文件失败");return 1;}return 0;
}
代码先打开一个文件用于读写,接着通过pwrite
函数在指定的文件偏移量位置写入数据,处理写入结果后关闭文件。
7. lseek()
函数示例(结合open()
函数使用)
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>int main() {int fd;off_t new_offset;// 以读写方式打开文件fd = open("test_lseek.txt", O_RDWR);if (fd == -1) {perror("打开文件失败");return 1;}// 将文件读写指针移动到文件末尾new_offset = lseek(fd, 0, SEEK_END);if (new_offset == -1) {perror("移动文件指针失败");close(fd);return 1;}printf("文件指针已移动到文件末尾,当前偏移量为: %ld\n", new_offset);// 关闭文件if (close(fd) == -1) {perror("关闭文件失败");return 1;}return 0;
}
此示例打开一个文件后,使用lseek
函数将文件读写指针移动到文件末尾,获取并打印新的偏移量,最后关闭文件。
8. stat()
函数示例
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>int main() {struct stat file_stat;// 获取文件状态信息if (stat("test.txt", &file_stat) == -1) {perror("获取文件状态信息失败");return 1;}// 打印文件大小(字节数)printf("文件大小为: %ld 字节\n", file_stat.st_size);// 打印文件权限(八进制表示)printf("文件权限(八进制): %o\n", file_stat.st_mode & 0777);return 0;
}
该代码通过stat
函数获取指定文件的状态信息,然后从struct stat
结构体中提取文件大小和权限等信息并进行打印。
9. fstat()
函数示例(结合open()
函数使用)
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>int main() {int fd;struct stat file_stat;// 以只读方式打开文件fd = open("test.txt", O_RDONLY);if (fd == -1) {perror("打开文件失败");return 1;}// 获取已打开文件的状态信息if (fstat(fd, &file_stat) == -1) {perror("获取文件状态信息失败");close(fd);return 1;}// 打印文件大小(字节数)printf("文件大小为: %ld 字节\n", file_stat.st_size);// 关闭文件if (close(fd) == -1) {perror("关闭文件失败");return 1;}return 0;
}
代码先打开一个文件,然后使用fstat
函数获取该已打开文件的状态信息,从中获取文件大小并打印,最后关闭文件。
10. close()
函数示例(在上述各示例中都有体现,以下单独简单示意)
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>int main() {int fd = 3; // 假设这里有一个文件描述符为3的已打开文件(实际应用中通常由open等函数获取)if (close(fd) == -1) {perror("关闭文件失败");return 1;}printf("文件已成功关闭\n");return 0;
}
这个简单示例演示了使用close
函数关闭一个给定文件描述符对应的文件,根据返回值判断关闭是否成功。
11. 目录文件操作相关函数示例
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>int main() {DIR *dp;struct dirent *ep;// 打开当前目录dp = opendir(".");if (dp == NULL) {perror("打开目录失败");return 1;}// 读取目录中的条目并打印文件名while ((ep = readdir(dp))!= NULL) {printf("文件名: %s\n", ep->d_name);}// 关闭目录if (closedir(dp) == -1) {perror("关闭目录失败");return 1;}return 0;
}
这段代码首先使用opendir
函数打开当前目录,然后通过readdir
函数循环读取目录中的文件和子目录条目,并打印它们的名称,最后使用closedir
函数关闭打开的目录。
实践案例
- 简单的文件复制程序
- 案例描述:
- 编写一个C程序,实现将一个文件的内容复制到另一个文件中。这个案例涉及到文件的打开、读取和写入操作。
- 代码实现:
- 案例描述:
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#define BUFFER_SIZE 1024
int main(int argc, char *argv[]) {int source_fd, destination_fd;ssize_t num_read, num_written;char buffer[BUFFER_SIZE];// 检查命令行参数是否正确if (argc!= 3) {fprintf(stderr, "用法: %s <源文件> <目标文件>\n", argv[0]);return 1;}// 打开源文件,以只读方式source_fd = open(argv[1], O_RDONLY);if (source_fd == -1) {perror("打开源文件失败");return 1;}// 打开目标文件,以写入方式,如果不存在则创建,权限为0644destination_fd = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0644);if (destination_fd == -1) {perror("打开目标文件失败");close(source_fd);return 1;}// 从源文件读取数据并写入目标文件while ((num_read = read(source_fd, buffer, sizeof(buffer))) > 0) {num_written = write(destination_fd, buffer, num_read);if (num_written == -1) {perror("写入目标文件失败");close(source_fd);close(destination_fd);return 1;}}if (num_read == -1) {perror("读取源文件失败");close(source_fd);close(destination_fd);return 1;}// 关闭文件if (close(source_fd) == -1) {perror("关闭源文件失败");close(destination_fd);return 1;}if (close(destination_fd) == -1) {perror("关闭目标文件失败");return 1;}return 0;
}
- 案例分析:
- 首先,程序通过
open
函数分别打开源文件和目标文件,注意打开方式的选择。然后,使用read
函数从源文件读取数据到缓冲区,再通过write
函数将缓冲区的数据写入目标文件。在循环过程中,不断重复读取和写入操作,直到read
函数返回0,表示已经读取完源文件的内容。最后,关闭源文件和目标文件。
- 首先,程序通过
- 文件内容统计程序
- 案例描述:
- 编写一个脚本(以Bash脚本为例),用于统计一个文本文件中单词的数量。这个案例涉及到文件的读取和简单的文本处理。
- 代码实现:
- 案例描述:
#!/bin/bash
if [ $# -ne 1 ]; thenecho "用法: $0 <文件名>"exit 1
fi
filename="$1"
if [! -f "$filename" ]; thenecho "文件不存在"exit 1
fi
word_count=$(cat "$filename" | wc -w)
echo "文件 $filename 中的单词数量为: $word_count"
- 案例分析:
- 脚本首先检查命令行参数的个数是否正确,然后判断指定的文件是否存在。如果文件存在,使用
cat
命令读取文件内容,并通过管道|
将内容传递给wc -w
命令,wc -w
用于统计单词数量。最后将统计结果输出。
- 脚本首先检查命令行参数的个数是否正确,然后判断指定的文件是否存在。如果文件存在,使用
- 文件权限修改程序
- 案例描述:
- 编写一个C程序,用于修改指定文件的权限。这个案例涉及到文件属性的操作。
- 代码实现:
- 案例描述:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int main(int argc, char *argv[]) {if (argc!= 3) {fprintf(stderr, "用法: %s <文件名> <权限模式(八进制)>\n", argv[0]);return 1;}const char *filename = argv[1];mode_t mode = (mode_t) strtol(argv[2], NULL, 8);if (chmod(filename, mode) == -1) {perror("修改权限失败");return 1;}return 0;
}
- 案例分析:
- 程序首先检查命令行参数的个数是否正确,然后将第二个参数(以八进制表示的权限模式)转换为
mode_t
类型。接着使用chmod
函数来修改指定文件的权限。如果chmod
函数返回 - 1,表示修改权限失败,程序会输出错误信息。
- 程序首先检查命令行参数的个数是否正确,然后将第二个参数(以八进制表示的权限模式)转换为
- 文件搜索程序
- 案例描述:
- 编写一个Python程序,在指定目录及其子目录下搜索指定文件名的文件。这个案例涉及到目录的遍历和文件的检查。
- 代码实现:
- 案例描述:
import osdef search_file(directory, filename):for root, dirs, files in os.walk(directory):for file in files:if file == filename:print(os.path.join(root, file))if __name__ == "__main__":directory = input("请输入要搜索的目录: ")filename = input("请输入要搜索的文件名: ")search_file(directory, filename)
- 案例分析:
- 程序定义了一个
search_file
函数,使用os.walk
函数来遍历指定目录及其子目录。os.walk
返回一个三元组(root, dirs, files)
,其中root
是当前遍历的目录路径,dirs
是当前目录下的子目录列表,files
是当前目录下的文件列表。在循环中,检查每个文件的名称是否与目标文件名相同,如果相同,则输出文件的完整路径。
- 程序定义了一个
用open()函数实现一个简单的文本编辑器
以下是一个使用C语言中的open()
函数以及其他相关文件操作函数实现的简单文本编辑器示例,它可以实现创建新文件、打开已有文件、写入内容、读取内容以及保存修改等基本功能(这里只是一个简单的演示,没有复杂的文本编辑界面和功能,主要聚焦在文件操作层面)。
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>#define MAX_BUFFER_SIZE 1024// 函数声明
void create_file(const char *filename);
void open_file(int *fd, const char *filename);
void write_to_file(int fd, const char *content);
void read_file(int fd);
void save_file(int fd, const char *filename);
void close_file(int fd);int main() {int choice, fd = -1;char filename[100];char content[MAX_BUFFER_SIZE];while (1) {printf("\n简单文本编辑器功能菜单:\n");printf("1. 创建新文件\n");printf("2. 打开现有文件\n");printf("3. 写入内容到文件\n");printf("4. 读取文件内容\n");printf("5. 保存文件\n");printf("6. 关闭文件并退出\n");printf("请输入你的选择: ");scanf("%d", &choice);switch (choice) {case 1:printf("请输入要创建的文件名: ");scanf("%s", filename);create_file(filename);break;case 2:printf("请输入要打开的文件名: ");scanf("%s", filename);open_file(&fd, filename);break;case 3:if (fd == -1) {printf("请先打开或创建一个文件。\n");continue;}printf("请输入要写入文件的内容(一行内容,按回车键结束): ");scanf("%s", content);write_to_file(fd, content);break;case 4:if (fd == -1) {printf("请先打开一个文件。\n");continue;}read_file(fd);break;case 5:if (fd == -1) {printf("请先打开或创建一个文件。\n");continue;}save_file(fd, filename);break;case 6:if (fd!= -1) {close_file(fd);}return 0;default:printf("无效的选择,请重新输入。\n");}}return 0;
}// 创建新文件的函数
void create_file(const char *filename) {int fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0644);if (fd == -1) {perror("创建文件失败");return;}close(fd);printf("文件 %s 创建成功。\n", filename);
}// 打开文件的函数
void open_file(int *fd, const char *filename) {*fd = open(filename, O_RDWR);if (*fd == -1) {perror("打开文件失败");return;}printf("文件 %s 打开成功。\n", filename);
}// 写入内容到文件的函数
void write_to_file(int fd, const char *content) {ssize_t num_written = write(fd, content, strlen(content));if (num_written == -1) {perror("写入文件失败");return;}printf("成功写入 %zd 个字节到文件。\n", num_written);
}// 读取文件内容的函数
void read_file(int fd) {char buffer[MAX_BUFFER_SIZE];ssize_t num_read = read(fd, buffer, sizeof(buffer));if (num_read == -1) {perror("读取文件失败");return;} else if (num_read == 0) {printf("文件为空或已读到文件末尾。\n");} else {buffer[num_read] = '\0';printf("文件内容如下:\n%s\n", buffer);}
}// 保存文件的函数(这里简单的重新写入覆盖原文件内容,可优化为更复杂的保存逻辑)
void save_file(int fd, const char *filename) {// 先关闭文件close(fd);// 再以只写方式打开,覆盖原内容写入fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0644);if (fd == -1) {perror("保存文件失败");return;}char buffer[MAX_BUFFER_SIZE];lseek(fd, 0, SEEK_SET);ssize_t num_read = read(fd, buffer, sizeof(buffer));if (num_read!= -1 && num_read > 0) {buffer[num_read] = '\0';ssize_t num_written = write(fd, buffer, strlen(buffer));if (num_written == -1) {perror("保存文件时写入内容失败");close(fd);return;}}close(fd);printf("文件保存成功。\n");
}// 关闭文件的函数
void close_file(int fd) {if (close(fd) == -1) {perror("关闭文件失败");return;}printf("文件已关闭。\n");
}
以下是对这个代码的详细说明:
1. 整体结构和主函数逻辑
- 程序通过一个无限循环展示功能菜单,让用户选择相应的操作,包括创建文件、打开文件、写入内容、读取内容、保存文件以及关闭文件并退出等选项。
- 根据用户输入的不同选择,调用相应的函数来执行具体的文件操作。在进行某些操作(如写入、读取、保存等)前,会先判断文件是否已经正确打开(通过文件描述符是否为 - 1 来判断),若未打开则提示用户先打开或创建文件。
2. 各个功能函数介绍
create_file
函数:- 使用
open()
函数以O_WRONLY | O_CREAT | O_TRUNC
模式打开指定文件名的文件,这意味着如果文件不存在则创建它,若存在则截断(清空)其原有内容,权限设置为0644
(所有者读写,所属组和其他用户只读)。 - 如果
open
操作成功,获取到文件描述符后,使用close
函数关闭文件,因为这里只是创建操作,暂时不需要对文件进行读写,关闭后提示用户文件创建成功;若open
失败,则通过perror
函数打印错误信息。
- 使用
open_file
函数:- 接收一个指向整数(用于存储文件描述符)的指针和文件名作为参数,使用
open()
函数以O_RDWR
(读写)模式打开文件。 - 若打开成功,将获取到的文件描述符赋值给传入的指针指向的变量,并提示用户文件打开成功;若打开失败,则通过
perror
函数打印错误信息。
- 接收一个指向整数(用于存储文件描述符)的指针和文件名作为参数,使用
write_to_file
函数:- 接收文件描述符和要写入的内容字符串作为参数,使用
write()
函数将内容写入文件。 - 根据
write
函数的返回值判断写入是否成功,若成功则打印写入的字节数,若失败则通过perror
函数打印错误信息。
- 接收文件描述符和要写入的内容字符串作为参数,使用
read_file
函数:- 接收文件描述符作为参数,定义一个缓冲区数组,使用
read()
函数从文件中读取内容到缓冲区。 - 根据
read
函数的返回值进行不同处理:返回 - 1 表示读取失败,打印错误信息;返回 0 表示文件为空或已读到文件末尾,给出相应提示;若读取到有效内容,则在缓冲区末尾添加字符串结束符后打印出文件内容。
- 接收文件描述符作为参数,定义一个缓冲区数组,使用
save_file
函数:- 先关闭已打开的文件(因为要重新以写入模式打开覆盖原内容),然后再以
O_WRONLY | O_CREAT | O_TRUNC
模式打开文件,这样可以确保将当前内存中的内容重新覆盖写入文件(这里只是简单实现了重新写入覆盖,可根据实际需求优化保存逻辑,比如实现追加保存等更复杂的功能)。 - 通过
lseek
函数将文件指针移动到文件开头,读取文件现有内容到缓冲区,再将缓冲区内容写回文件(这里同样可以优化,比如考虑部分写入等情况),若写入成功则关闭文件并提示文件保存成功,若出现错误则打印错误信息并关闭文件。
- 先关闭已打开的文件(因为要重新以写入模式打开覆盖原内容),然后再以
close_file
函数:- 接收文件描述符作为参数,使用
close()
函数关闭文件,根据返回值判断关闭是否成功,若失败则通过perror
函数打印错误信息,若成功则提示文件已关闭。
- 接收文件描述符作为参数,使用
请注意,这个简单文本编辑器只是一个基础的示例,实际应用中的文本编辑器功能要复杂得多,例如支持多行编辑、文本格式处理、光标定位等功能,还需要更好的用户交互界面(如图形界面或者更友好的命令行交互方式等),但这个示例可以帮助理解在Linux环境下如何通过open()
等文件操作函数来进行基本的文件读写与管理。
相关文章:
linux----文件访问(c语言)
linux文件访问相关函数 打开文件函数 - open 函数原型:int open(const char *pathname, int flags, mode_t mode);参数说明: pathname:这是要打开的文件的路径名,可以是绝对路径或者相对路径。例如,"/home/user/…...
垂起固定翼无人机大面积森林草原巡检技术详解
垂起固定翼无人机大面积森林草原巡检技术是一种高效、精准的监测手段,以下是对该技术的详细解析: 一、垂起固定翼无人机技术特点 垂起固定翼无人机结合了多旋翼和固定翼无人机的优点,具备垂直起降、飞行距离长、速度快、高度高等特点。这种无…...
汽车电子零部件(15):AVM全景影像系统
概述: 使用ADAS全景监控(AVM)精确停车和操纵。这项先进技术采用多个摄像头,提供车辆周围环境的鸟瞰图。 360度全景监控系统: 360 AVM系统可以帮助驾驶员360度查看车辆周围的情况,避免发生碰撞。360 AVM系统由一个电子控制单元(ECU)和四个摄像头组成。ECU将处理四个摄…...
G口带宽服务器与1G独享带宽服务器:深度剖析其差异
在数据洪流涌动的数字化时代,服务器作为数据处理的核心,其性能表现直接关系到业务的流畅度和用户体验的优劣。随着技术的飞速发展,G口带宽服务器与1G独享带宽服务器已成为众多企业的优选方案。然而,这两者之间究竟有何细微差别&am…...
鸿蒙项目云捐助第十一讲鸿蒙App应用的捐助成功自定义对话框组件实现
在生活中,用户做了一个好事后,很多场合都会收到一份感谢。在捐助的行业也是一样的,用户捐出了一片爱心,就会收获一份温情。这里的温情是通过自定义对话框实现的。 一、通过自定义对话框组件实现捐款成功的信息页 这里用户捐款成…...
Elasticsearch-分词器详解
什么是分词器 1、分词器介绍 对文本进行分析处理的一种手段,基本处理逻辑为按照预先制定的分词规则,把原始文档分割成若干更小粒度的词项,粒度大小取决于分词器规则。 常用的中文分词器有ik按照切词的粒度粗细又分为:ik_max_word和ik_smart&…...
Android笔试面试题AI答之Android基础(3)
文章目录 1.谈一谈 Android 的安全机制一、系统架构层面的安全设计二、核心安全机制三、其他安全机制与措施 2.Android 的四大组件是哪四大?3.Android 的四大组件都需要在清单文件中注册吗?4.介绍几个常用的Linux命令一、文件和目录管理二、用户和权限管…...
酷黑金色配色 影片素材不过时 色彩丰富 电影主题html
本套大作业共计8个HTML页面,网页中包含:DIVCSS、下拉菜单栏、banner轮播图、图片放大效果、鼠标滑过效果、视频、小图标及按钮设计、登录注册页等,同时设计了logo;本作品花费大量时间去整理素材,大部分素材均使用Photo…...
《Go 语言变量》
《Go 语言变量》 介绍 Go 语言是一种静态类型、编译型的编程语言,由 Google 开发。它以其简洁的语法、高效的并发处理和强大的标准库而闻名。在 Go 语言中,变量是存储数据的基本单位,它们可以是各种数据类型,如整数、浮点数、布…...
Tool之Excalidraw:Excalidraw(开源的虚拟手绘风格白板)的简介、安装和使用方法、艾米莉应用之详细攻略
Tool之Excalidraw:Excalidraw(开源的虚拟手绘风格白板)的简介、安装和使用方法、艾米莉应用之详细攻略 目录 Excalidraw 简介 1、Excalidraw 的主要特点: Excalidraw 安装和使用方法 1、Excalidraw的安装 T1、使用 npm 安装: T2、使用 …...
Llama 3 模型系列解析(一)
目录 1. 引言 1.1 Llama 3 的简介 1.2 性能评估 1.3 开源计划 1.4 多模态扩展 ps 1. 缩放法则 2. 超额训练(Over-training) 3. 计算训练预算 4. 如何逐步估算和确定最优模型? 2. 概述 2.1 Llama 3 语言模型开发两个主要阶段 2.2…...
重拾设计模式--观察者模式
文章目录 观察者模式(Observer Pattern)概述观察者模式UML图作用:实现对象间的解耦支持一对多的依赖关系易于维护和扩展 观察者模式的结构抽象主题(Subject):具体主题(Concrete Subject…...
3-Gin 渲染 --[Gin 框架入门精讲与实战案例]
在 Gin 框架中,渲染指的是将数据传递给模板,并生成 HTML 或其他格式的响应内容。Gin 支持多种类型的渲染,包括 String HTML、JSON、XML 等。 String 渲染 在 Gin 框架中,String 渲染方法允许你直接返回一个字符串作为 HTTP 响应…...
回溯---java---黑马
回溯 概念 程序在运行过程中分成了多个阶段 通过某些手段,将数据恢复到某一阶段,称之为回溯 手段包括:方法栈、自定义栈 使用基本数据类型n public class Backtracking{public static void main(String[] args) {rec(1);}public void r…...
【数据结构】排序(附测试源码)
【数据结构】排序(附测试源码) 本节是数据结构排序版(不完整版,没有C语言版的哈希表) 1.排序概念: 1.1所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增…...
【翻译】大型 Transformer 模型推理优化
翻译原文:Large Transformer Model Inference Optimization | LilLog 原文作者:Lilian Weng 目录 方法概述蒸馏 Distillation量化 Quantization Transformer 量化的挑战训练后量化 (PTQ) 混合精度量化 Mixed-precision quantization细粒度量化量化的二…...
RabbitMQ概述
目录 RabbitMQ概述 前言 MQ MQ的作用 为什么选择RabbitMQ RabbitMQ的介绍 RabbitMQ概述 前言 Rabbit, 兔⼦的意思 互联⽹⾏业很多公司, 都喜欢⽤动物命名产品, 或者作为公司的logo, 吉祥物. ⽐如: 腾讯的企鹅, 京东的狗, 美团的袋⿏, 携程的海豚,阿⾥就更多了, 蚂蚁, ⻜…...
《PCI密码卡技术规范》题目
单选1 在《PCI密码卡技术规范》中,下列哪项不属于PCI密码卡的功能()。 A.密码运算功能 B.密钥管理功能 C.物理随机数产生功能 D.随主计算机可信检测功能 正确答案:D. <font style="color:#DF2A3F;">解析:</font> 单选 2 在《PCI密码卡技术规…...
AI开发:使用支持向量机(SVM)进行文本情感分析训练 - Python
支持向量机是AI开发中最常见的一种算法。之前我们已经一起初步了解了它的概念和应用,今天我们用它来进行一次文本情感分析训练。 一、概念温习 支持向量机(SVM)是一种监督学习算法,广泛用于分类和回归问题。 它的核心思想是通过…...
ECharts柱状图-柱图42,附视频讲解与代码下载
引言: 在数据可视化的世界里,ECharts凭借其丰富的图表类型和强大的配置能力,成为了众多开发者的首选。今天,我将带大家一起实现一个柱状图图表,通过该图表我们可以直观地展示和分析数据。此外,我还将提供…...
呼入机器人:24小时客户服务的未来趋势
呼入机器人:24小时客户服务的未来趋势 作者:开源大模型智能呼叫中心系统FreeAICC,Github:https://github.com/FreeIPCC/FreeAICC 在当今快节奏的商业环境中,客户服务已成为企业竞争的核心要素之一。随着人工智能技术…...
FFmpeg 安装教程(Windows 系统)
1. 前言 FFmpeg 是一个用于处理视频、音频等多媒体文件的开源工具包。它支持几乎所有的多媒体格式转换、剪辑和编辑,是开发者和多媒体工作者必备的工具。本文详细讲解如何在 Windows 系统上安装 FFmpeg 并进行基本配置。 2. 下载 FFmpeg 安装包 打开 Dpwnload FFmp…...
左神算法基础巩固--1
文章目录 时间复杂度常数时间的操作时间复杂度的定义时间复杂度的作用剖析递归行为和递归行为时间复杂度的估算 排序选择排序冒泡排序插入排序归并排序小和问题问题描述解题思路 快速排序荷兰国旗问题问题描述 堆排序堆结构大根堆小根堆 桶排序 二分二分搜索 ^的运用不用额外空…...
基于鲲鹏服务器的打砖块小游戏部署
案例介绍 鲲鹏服务器是基于鲲鹏处理器的新一代数据中心服务器,适用于大数据、分布式存储、高性能计算和数据库等应用。鲲鹏服务器具有高性能、低功耗、灵活的扩展能力,适合大数据分析、软件定义存储、Web等应用场景。 本案例将指导开发者如何在鲲鹏服务…...
STM32F407寄存器点灯
背景描述: 最近用32开发遇到问题不得不看寄存器了,就回顾了一下寄存器手册的查看方式和寄存器的使用方法; 上一次这么细致的记录还是在刚学习STM32的时候,之前觉得看寄存器手册以及配置寄存器是有点难度的事情,现在回头…...
电子电气架构 --- 队列刷写场景及刷写上位机浅析
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所谓鸡汤,要么蛊惑你认命,要么怂恿你拼命,但都是回避问题的根源,以现象替代逻辑,以情绪代替思考,把消极接受现实的懦弱,伪装成乐观面对不幸的…...
kubernates实战
使用k8s来部署tomcat 1、创建一个部署,并指定镜像地址 kubectl create deployment tomcat6 --imagetomcat:6.0.53-jre82、查看部署pod状态 kubectl get pods # 获取default名称空间下的pods kubectl get pods --all-namespaces # 获取所有名称空间下的pods kubect…...
换工作,如何退出微软账户???(删除注册表数据)
1.Winr 进入 输入. 2.删除 注意路径. 3.删除 注意路径. 4.效果如下,清空成功...
vscode+编程AI配置、使用说明
文章目录 [toc]1、概述2、github copilot2.1 配置2.2 使用文档2.3 使用说明 3、文心快码(Baidu Comate)3.1 配置3.2 使用文档3.3 使用说明 4、豆包(MarsCode)4.1 配置4.2 使用文档4.3 使用说明 5、通义灵码(TONGYI Lin…...
60.基于SSM的个人网站的设计与实现(项目 + 论文)
项目介绍 本站是一个B/S模式系统,个人网站是在MySQL中建立数据表保存信息,运用SSMVue框架和Java语言编写。并按照软件设计开发流程进行设计实现充分保证系统的稳定性。系统具有界面清晰、操作简单,功能齐全的特点,使得基于SSM的网…...
myexcel的使用
参考: (1)api文档:https://www.bookstack.cn/read/MyExcel-2.x/624d8ce73162300b.md (2)源代码: https://github.com/liaochong/myexcel/issues 我: (1)m…...
CSDN外链失效3:
参考我之前的博客: 外链失效博客1:随想笔记1:CSDN写博客经常崩溃,遇到外链图片转存失败怎么办_csdn外链图片转存失败-CSDN博客 外链失效博客2:网络随想2:转语雀_md格式转语雀lake格式-CSDN博客 markdown…...
SSM 医院预约挂号系统:Vue 技术驱动下的设计与实现飞跃
3系统分析 3.1可行性分析 通过对本医院预约挂号系统实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本医院预约挂号系统采用SSM框架,JAVA作为开发语…...
如何在centos系统上挂载U盘
在CentOS上挂载NTFS格式的U盘,需要执行一系列步骤,包括识别U盘设备、安装必要的软件、创建挂载点,并最终挂载U盘。以下是在CentOS上挂载NTFS格式U盘的详细步骤: 一、准备工作 确认CentOS版本: 确保你的CentOS系统已经安装并正常运行。不同版本的CentOS在命令和工具方面可能…...
lshw学习——简单介绍
文章目录 简介核心结构扫描设备原理scan_abiscan_burnerscan_cdromscan_cpufreqscan_cpuidscan_cpuinfoscan_device_treescan_diskscan_displayscan_dmiscan_fatscan_fbscan_graphicsscan_idescan_ideraidscan_inputscan_isapnpscan_lvmscan_memoryscan_mmcscan_mountsscan_net…...
UI自动化概念+Web自动化测试框架
1.UI自动化测试概念:我们先明确什么是UI UI,即(User Interface简称UI用户界面)是系统和用户之间进行交互和信息交换的媒介 UI自动化测试:Web自动化测试和移动自动化测试都属于UI自动化测试,UI自动化测试就是借助自动化工具对程序UI层进行自动化的测试 …...
java: 无效的目标发行版: xx
java: 无效的目标发行版: xx 背景java: 无效的目标发行版: xx 在 Intellij 的修复 背景 这里单独针对Intellij开发工具对 “java: 无效的目标发行版: xx”错误的修复。 java: 无效的目标发行版: xx 在 Intellij 的修复 同一台电脑使用多个JDK的时候容易出现在运行程序时容易…...
【QSS样式表 - ③】:QSS常用属性
文章目录 QSS常用属性字体样式QSS示例 边框样式QSS示例 盒子模型背景颜色、背景图片background-QSS示例 border-imageQSS示例1QSS示例2 QObject属性QSS示例 QSS常用属性 字体样式 以上也可以直接写成一行: font: 字体风格 字体粗细 字体大小 字体名称;QSS示例 新…...
WPF Binding 绑定
绑定是 wpf 开发中的精髓,有绑定才有所谓的数据驱动。 1 . 背景 目前 wpf 界面可视化的控件,继承关系如下, 控件的数据绑定,基本上都要借助于 FrameworkElement 的 DataContext 属性。 只有先设置了控件的 DataContext 属性&…...
掌握Java分支结构:if和switch详解
在编程中,顺序结构确实只能按照代码的书写顺序依次执行,而无法根据条件进行判断和选择。为了实现程序根据不同情况执行不同代码块的功能,我们需要使用分支结构。Java提供了两种主要的分支结构来帮助开发者实现这一目标: if 语句&…...
ES学习Promise对象(九)
这里写目录标题 一、概念二、示例基本使用使用 Promise 对象封装Ajaxthen() 方法catch() 方法 一、概念 简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。Promise 是一个对象,Promise 提供统一…...
ssh 密钥对文件登录
首先提供我生成的密钥对【test-241222.pem】: -----BEGIN RSA PRIVATE KEY----- MIIEowIBAAKCAQEAkrx1O 【.....】 -----END RSA PRIVATE KEY----- 1. 验证私钥格式 首先,确认test-241222.pem确实是有效的RSA私钥。你可以通过以下命令来验证(在Linux/Mac上): openssl …...
电流、电压,串联电路中,电流为什么处处相等?
电流是什么?串、并联中,电流的关系 飞书链接,看这个,格式更好,提供书籍下载 电流的本质定义: 电流 (I) 是 单位时间内,通过导体截面的电荷量。它的数学定义是: I Δ Q Δ t I \f…...
Python生成学生管理系统,使用qt组件,MySQL 数据库,-1
创建一个基于 Python 的学生管理系统,使用 Qt 组件(通过 PyQt5 或 PySide2)和 MySQL 数据库,是一个综合性的项目。以下是一个详细的指南,包括环境设置、数据库设计、Python 代码示例以及如何使用 Qt 设计用户界面。 #…...
接口测试Day03-postman断言关联
postman常用断言 注意:不需要手敲,点击自动生成 断言响应状态码 Status code:Code is 200 //断言响应状态码为 200 pm.test("Status code is 200", function () {pm.response.to.have.status(200); });pm: postman的实例 test() …...
微服务分布式(二、注册中心Consul)
首先我们需要安装consul,到官网下载Consul Install | Consul | HashiCorp Developer 在解压的consul目录下 执行启动命令 consul agent -dev 启动服务 -dev表示开发模式 -server表示服务模式 启动后在浏览器访问8500端口http://localhost:8500/可以看到服务管理界面 项目…...
sh cmake-linux.sh -- --skip-license --prefix = $MY_INSTALL_DIR
本文来自天工AI --------- 命令用于安装CMake的脚本,其中--skip-license参数表示跳过许可协议的显示,--prefix参数指定了CMake的安装目录。$MYINSTALLDIR是一个环境变量,应该在运行命令之前设置为您想要安装CMake的目录。 -------- sh xx…...
信创技术栈发展现状与展望:机遇与挑战并存
一、引言 在信息技术应用创新(信创)战略稳步推进的大背景下,我国信创技术栈已然在诸多关键层面收获了亮眼成果,不过也无可避免地遭遇了一系列亟待攻克的挑战。信创产业作为我国达成信息技术自主可控这一目标的关键一招,…...
文本图像多模态基础-clip的细节解读
目录 一、我写的目的 二、原文出处 三、方法和benchmark 3.1 方法原理 3.2 值得注意的代码细节 实际的损失函数计算: evaluation的计算: backbone的类型: 3.3 benchamrk 推理时的细节-benchmark比较: 经典benchmark对…...
c4d动画怎么导出mp4视频,c4d动画视频格式设置
宝子们,今天来给大家讲讲 C4D 咋导出mp4视频的方法。通过用图文教程的形式给大家展示得明明白白的,让你能轻松理解和掌握,不管是理论基础,还是实际操作和技能技巧,都能学到,快速入门然后提升自己哦。 c4d动…...