C语言编程笔记:文件处理的艺术
大家好,这里是小编的博客频道
小编的博客:就爱学编程
很高兴在
CSDN
这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!!
本文目录
- 引言
- 正文
- 一、为什么要用文件
- 二、文件的分类
- 三、文件指针
- 四、文件的打开与关闭
- 1. 文件的打开
- 2. 文件的关闭
- 五、文件缓冲区
- 六、文件的基本操作
- (1)打开文件
- (2)关闭文件
- (3)检测文件末尾和错误
- (4)清除文件错误标志
- 七、顺序读写文件
- (1)字符级操作函数
- fgetc()
- fputc()
- (2)字符串级操作函数
- fgets()
- fputs()
- (3)格式化输入输出函数
- fprintf()
- fscanf()
- 八、随机读写文件
- (1)文件指针与定位函数
- 示例代码
- 示例1:基本随机读写
- 示例2:使用`ftell`获取当前位置
- 示例3:二进制文件的随机读写
- 九、读取错误检查
- (1)错误检查函数
- (2)错误处理策略
- (3)示例代码
- 示例1:使用`ferror`检查读取错误
- 示例2:使用`feof`检查文件末尾
- 十、总结
- 快乐的时光总是短暂,咱们下篇博文再见啦!!!不要忘了,给小编点点赞和收藏支持一下,在此非常感谢!!!
引言
在C语言编程中,文件操作是数据处理的重要部分。通过文件,我们可以实现数据的持久化存储和共享。下面重点通过多个例子讲清文件的打开和关闭这两个函数。那现在宝子们就跟着小编的步伐一起进入本章知识的学习。Go!Go!Go!
那接下来就让我们开始遨游在知识的海洋!
正文
一、为什么要用文件
这是因为:
- 在程序执行过程中,
有时需要将数据保存下来供以后使用,或者从外部获取数据进行处理
。这时,我们就需要使用到文件。文件是一种用于存储数据的媒介,它可以是磁盘上的物理文件,也可以是内存中的虚拟文件。通过使用文件,我们可以方便地实现数据的长期保存和跨程序的数据共享
。
二、文件的分类
在C语言中,文件通常按照其内容和用途进行分类,主要包括文本文件和二进制文件两种类型:
- 文本文件:
以ASCII码或Unicode码形式存储的文件,主要用于存储人类可读的字符信息,如源代码、文档等。
- 二进制文件:
以二进制形式存储的文件,主要用于存储机器可直接读取和处理的数据,如图像、音频、视频等多媒体文件。
三、文件指针
在C语言中,文件操作是通过文件指针来实现的。
文件指针是一个指向FILE结构体的指针,该结构体包含了文件的各种信息,如文件名、文件位置指示器、文件结束标志等。通过文件指针,我们可以对文件进行各种操作,如读写、定位
等。
四、文件的打开与关闭
1. 文件的打开
在C语言中,打开文件需要使用fopen()
函数。该函数原型如下:
FILE *fopen(const char *filename, const char *mode);
其中,filename
参数是要打开的文件名(包括路径),mode
参数指定了文件的打开模式。常见的打开模式有:
"r"
:只读模式。如果文件不存在,则打开失败;如果文件存在,则只能从中读取数据。"w"
:写模式。如果文件不存在,则以指定的文件名创建新文件;如果文件已存在,则删除原有内容,从头开始写入新数据。"a"
:追加模式。如果文件不存在,则以指定的文件名创建新文件;如果文件已存在,则在文件末尾追加新数据。"rb"
、"wb"
、"ab"
:分别表示以二进制方式打开文件,进行读、写、追加操作。
以下是一些使用fopen()
函数打开文件的示例:
示例1:以只读模式打开文本文件
#include <stdio.h>int main() {FILE *fp;fp = fopen("text.txt", "r"); // 打开名为"text.txt"的文本文件,以只读模式if (fp == NULL) {printf("无法打开文件
");return 1;} else {printf("文件成功打开
");// 在此处可以进行文件读取等操作fclose(fp); // 关闭文件}return 0;
}
示例2:以写模式打开文件
#include <stdio.h>int main() {FILE *fp;fp = fopen("output.txt", "w"); // 打开名为"output.txt"的文件,以写模式if (fp == NULL) {printf("无法打开文件
");return 1;} else {fprintf(fp, "Hello, World!
"); // 向文件中写入字符串fclose(fp); // 关闭文件}return 0;
}
示例3:以追加模式打开文件
#include <stdio.h>int main() {FILE *fp;fp = fopen("append.txt", "a"); // 打开名为"append.txt"的文件,以追加模式if (fp == NULL) {printf("无法打开文件
");return 1;} else {fprintf(fp, "This is a new line.
"); // 向文件末尾追加字符串fclose(fp); // 关闭文件}return 0;
}
示例4:以二进制方式打开文件
#include <stdio.h>int main() {FILE *fp;fp = fopen("binaryfile.bin", "rb"); // 打开名为"binaryfile.bin"的文件,以二进制方式读取if (fp == NULL) {printf("无法打开文件
");return 1;} else {// 在此处可以进行二进制文件的读取等操作fclose(fp); // 关闭文件}return 0;
}
2. 文件的关闭
在完成文件操作后,我们需要使用fclose()
函数来关闭文件。该函数原型如下:
int fclose(FILE *stream);
其中,stream
参数是一个指向要关闭的文件的指针。fclose()
函数会关闭文件,并释放与该文件相关的资源。如果关闭文件时发生错误,则返回非零值(通常为EOF);否则返回0。
以下是一个使用fclose()
函数关闭文件的示例:
示例5:关闭文件
#include <stdio.h>int main() {FILE *fp;fp = fopen("example.txt", "r"); // 打开一个文件if (fp != NULL) {// 在此处可以进行文件读取等操作if (fclose(fp) != 0) { // 关闭文件,并检查是否成功perror("Error closing file"); // 如果关闭失败,打印错误信息}} else {printf("无法打开文件
");}return 0;
}
需要注意的是:
- 在使用完文件后一定要及时关闭它,以避免资源泄露和潜在的文件损坏问题。同时,如果在打开文件时使用了
fopen()
函数并且成功打开了文件,那么在关闭文件时一定要确保传递给fclose()
函数的指针是与fopen()
返回的指针相同的。
五、文件缓冲区
为了提高文件操作的效率,C语言引入了文件缓冲区的概念。当向文件写入数据时,数据首先被写入到缓冲区中,而不是直接写入到磁盘上。只有当缓冲区满或者显式地调用刷新函数(如
fflush()
)时,缓冲区中的数据才会被写入到磁盘上。同样地,当从文件读取数据时,也是先从磁盘上将数据读取到缓冲区中,然后再从缓冲区中读取数据给程序使用。
这种缓冲区机制可以减少磁盘I/O操作的次数,从而提高文件操作的效率。但是,在某些情况下(如需要立即将数据写入磁盘以确保数据安全时),我们可能需要手动刷新缓冲区或者使用无缓冲的文件操作方式。
综上所述:
- C语言的文件操作涉及多个方面,包括文件的打开与关闭、读写操作、文件指针的使用以及文件缓冲区的处理等。通过掌握这些基础知识,我们可以更加高效地进行文件操作和数据处理工作。
六、文件的基本操作
(1)打开文件
使用fopen
函数可以打开一个文件。函数的原型如下:
FILE *fopen(const char *filename, const char *mode);
其中,filename
是文件名(包含路径),mode
是文件的打开模式(如读、写等)。
常见的模式有:
"r" : 只读方式打开文件,该文件必须存在。
"w" : 写入方式打开文件,若文件存在则长度被截为0,即该文件内容会消失;若文件不存在则创建新文件。
"a" : 以附加的方式打开文件,写入的数据会被添加到文件尾,即使使用了 fseek 之类的函数也不会改变。
"r+" : 可读写的方式打开文件,该文件必须存在。
"w+" : 可读写方式打开文件,若文件存在则文件长度被截为0,即该文件内容会消失;若文件不存在则创建新文件。
"a+" : 以可读写的方式打开文件,写入的数据会被添加到文件尾。
(2)关闭文件
使用 fclose
函数可以关闭一个已打开的文件。函数的原型如下:
int fclose(FILE *stream);
(3)检测文件末尾和错误
feof(FILE *stream)
: 检测是否到达文件末尾。
ferror(FILE *stream)
: 检测是否发生读写错误。
(4)清除文件错误标志
使用 clearerr
函数可以清除文件错误标志和文件结束标志。函数的原型如下:
void clearerr(FILE *stream);
顺序读写是指按照文件中数据的存储顺序依次进行读写操作
。
七、顺序读写文件
在C语言中,文件的顺序读写涉及多个函数,这些函数允许我们按照文件中的存储顺序来读取或写入数据。以下是顺序读写相关的函数详细介绍及代码示例:
(1)字符级操作函数
fgetc()
功能:
- 从指定的文件流中读取下一个字符(一个无符号字符),并将其作为
int
类型的值返回。如果到达文件末尾(EOF)或发生错误,则返回EOF
。
原型:
int fgetc(FILE *stream)
;
示例:
#include <stdio.h>
int main() {FILE *pf = fopen("text.txt", "r"); // 打开已经创建好的文件if (pf == NULL) {perror("fopen");return 1;}// 读文件int ret = fgetc(pf);printf("%c", ret);
ret = fgetc(pf);
printf("%c
", ret);
ret = fgetc(pf);
printf("%c
", ret);
// 关闭文件
fclose(pf);
pf = NULL;
return 0;
}
fputc()
功能:
- 将一个字符写入到指定的文件流中。
原型:
int fputc(int character, FILE *stream);
示例:
#include <stdio.h>
int main() {FILE *pf = fopen("text.txt", "w"); // 以写模式打开文件if (pf == NULL) {perror("fopen");return 1;}// 写文件fputc('a', pf);fputc('b', pf);fputc('c', pf);// 关闭文件fclose(pf);pf = NULL;return 0;
}
(2)字符串级操作函数
fgets()
功能:
- 从指定的文件流中读取一行文本(包括换行符,如果有的话,但最多读取到数组大小减一的位置),并将其存储在字符串中。如果成功,它会返回一个指向该字符串的指针;如果发生错误或到达文件末尾
(EOF)
而没有读取任何字符,则返回NULL
。
原型: char *fgets(char *string, int n, FILE *stream);
示例:
#include <stdio.h>
int main() {char arr[10] = {0};FILE *pf = fopen("text.txt", "r"); // 以读模式打开文件if (pf == NULL) {perror("fopen");return 1;}// 读文件fgets(arr, sizeof(arr), pf);printf("%s", arr);
// 关闭文件
fclose(pf);
pf = NULL;
return 0;
}
fputs()
功能:
- 将字符串写入到指定的文件流中,但不包括空字符’\0’。如果成功,它返回非负值;如果发生错误,则返回EOF。
原型:
int fputs(const char *string, FILE *stream);
示例:
#include <stdio.h>
int main() {FILE *pf = fopen("text.txt", "w"); // 以写模式打开文件if (pf == NULL) {perror("fopen");return 1;}// 写文件fputs("Hello, World!", pf);
// 关闭文件
fclose(pf);
pf = NULL;
return 0;
}
(3)格式化输入输出函数
fprintf()
功能:
- 向指定的输出流(如文件)写入格式化的数据。
原型: int fprintf(FILE *stream, const char *format[, argument]...);
示例:
#include <stdio.h>
struct S {char arr[10];int num;float sc;
};
int main() {struct S s = {"abcde", 10, 5.5f};FILE *pf = fopen("text.txt", "w"); // 以写模式打开文件if (pf == NULL) {perror("fopen");return 1;}// 写文件fprintf(pf, "%s %d %f", s.arr, s.num, s.sc);// 关闭文件fclose(pf);pf = NULL;return 0;
}
fscanf()
功能:
- 从指定的输入流(如文件)中按照指定格式读取数据。
原型: int fscanf(FILE *stream, const char *format[, argument]...);
示例:
#include <stdio.h>
struct S {char arr[10];int num;float sc;
};
int main() {struct S s = {0};FILE *pf = fopen("text.txt", "r"); // 以读模式打开文件if (pf == NULL) {perror("fopen");return 1;}// 读文件fscanf(pf, "%s %d %f", s.arr, &(s.num), &(s.sc));// 打印printf("%s %d %f", s.arr, s.num, s.sc);
// 关闭文件
fclose(pf);
pf = NULL;
return 0;
}
在C语言中,文件的随机读写是指能够在文件的任意位置进行读取或写入数据,而不仅仅是顺序地从头到尾处理文件。这种能力在处理大型数据文件时尤为重要,因为它允许程序高效地访问和修改文件中的特定部分。
八、随机读写文件
(1)文件指针与定位函数
要实现文件的随机读写,首先需要了解几个关键概念:
-
文件指针:用于标识打开的文件及其在存储设备上的当前位置。
-
定位函数:如
fseek()
、ftell()
和rewind()
等,用于移动文件指针到指定位置或获取当前位置。
fseek(FILE *stream, long offset, int whence)
:将文件指针移动到相对于某个位置的偏移量处。
whence
可以是SEEK_SET
(文件开头)、SEEK_CUR
(当前位置)或SEEK_END
(文件末尾)。
ftell(FILE *stream)
:返回当前文件指针的位置(相对于文件开头的字节数)。rewind(FILE *stream)
:将文件指针重新定位到文件的开头。
示例代码
以下是一些具体的例子,展示了如何在C语言中进行文件的随机读写操作。
示例1:基本随机读写
#include <stdio.h>
#include <stdlib.h>int main() {FILE *file = fopen("example.txt", "w+");if (!file) {perror("Failed to open file");return EXIT_FAILURE;}// 写入一些初始数据fprintf(file, "Hello, World!
This is a test.
");// 移动到文件的第7个字节处(索引从0开始)fseek(file, 6, SEEK_SET);// 在此处写入新字符fputc('C', file);// 重置文件指针到文件开头rewind(file);// 读取并打印文件内容char buffer[100];while (fgets(buffer, sizeof(buffer), file)) {printf("%s", buffer);}fclose(file);return EXIT_SUCCESS;
}
在这个例子中,我们打开了一个名为example.txt
的文件,写入了初始数据,然后将文件指针移动到第7个字节处(即'H'
和'e'
之间),并将该位置的字符替换为'C'
。最后,重置文件指针并打印整个文件的内容。
示例2:使用ftell
获取当前位置
#include <stdio.h>
#include <stdlib.h>int main() {FILE *file = fopen("numbers.txt", "w+");if (!file) {perror("Failed to open file");return EXIT_FAILURE;}// 写入一系列数字for (int i = 0; i < 10; ++i) {fprintf(file, "%d
", i);}// 移动到文件的第5行(实际上是第4个换行符之后)fseek(file, 4 * (sizeof(int) + 1), SEEK_SET); // 假设每个数字和换行符占用固定大小的空间// 获取当前文件指针位置long position = ftell(file);printf("Current file pointer position: %ld
", position);// 从当前位置继续写入fprintf(file, "Inserted Number
");// 重置文件指针并打印文件内容rewind(file);char buffer[100];while (fgets(buffer, sizeof(buffer), file)) {printf("%s", buffer);}fclose(file);return EXIT_SUCCESS;
}
这个例子中,我们创建了一个包含数字的文件,然后尝试在第5行的位置插入一个新字符串。注意,这里对文件指针的移动是基于假设的固定大小的数字和换行符,实际应用中可能需要更精确的计算或使用其他方法来确定正确的偏移量。
示例3:二进制文件的随机读写
#include <stdio.h>
#include <stdlib.h>typedef struct {int id;float value;
} Record;int main() {FILE *file = fopen("records.bin", "wb+");if (!file) {perror("Failed to open file");return EXIT_FAILURE;}// 写入一些记录Record records[] = {{1, 1.1}, {2, 2.2}, {3, 3.3}};fwrite(records, sizeof(Record), 3, file);// 移动到第二条记录的位置(索引从0开始)fseek(file, sizeof(Record), SEEK_SET);// 读取并修改第二条记录Record temp;fread(&temp, sizeof(Record), 1, file);temp.value += 10.0;// 将修改后的记录写回原位置(覆盖旧记录)fseek(file, -sizeof(Record), SEEK_CUR); // 或者直接使用之前的ftell结果fwrite(&temp, sizeof(Record), 1, file);// 重置文件指针并验证内容(这里仅为了演示,实际应关闭文件后重新打开读取)rewind(file);Record readRecords[3];fread(readRecords, sizeof(Record), 3, file);for (int i = 0; i < 3; ++i) {printf("ID: %d, Value: %.2f
", readRecords[i].id, readRecords[i].value);}fclose(file);return EXIT_SUCCESS;
}
- 在这个例子中,我们处理一个二进制文件,其中存储了结构体数组。我们展示了如何移动到特定的记录位置,读取它,进行修改,然后再将其写回到文件中。注意,由于我们在同一文件流中进行了读取和写入操作而没有关闭再重新打开文件,这里的验证步骤在实际应用中可能不准确;通常,你应该在修改完文件后关闭它,并在需要时以只读模式重新打开它以验证更改。
在C语言中,对文件进行读写操作时,进行错误检查是至关重要的。这不仅可以确保数据的完整性,还能提高程序的健壮性和可靠性。本文将详细介绍C语言文件操作中如何进行读取错误检查,并通过多个例子加以说明。
九、读取错误检查
(1)错误检查函数
C语言提供了几个函数来检查文件操作的错误状态:
ferror
:用于检查文件流上的最后一个I/O操作是否出错。其原型为int ferror(FILE *stream);
。如果返回非零值,则表示发生了错误。
perror
:用于打印描述最近一次错误的字符串。其原型为void perror(const char *s);
。其中,s
是一个用户提供的错误信息前缀,通常用于指示发生错误的上下文。
feof
:用于检查是否已经到达文件末尾。其原型为int feof(FILE *stream);
。如果返回非零值,则表示已经到达文件末尾。
(2)错误处理策略
在进行文件操作时,应该遵循以下错误处理策略:
- 在每次调用文件操作函数后,立即检查其返回值或错误状态。
- 如果发现错误,根据具体情况采取适当的措施,如打印错误信息、清理资源并退出程序等。
- 使用
clearerr
函数清除文件流的错误标志和文件结束标志,以便进行下一轮的文件操作。
(3)示例代码
以下是几个使用上述函数进行文件读取错误检查的示例代码:
示例1:使用ferror
检查读取错误
#include <stdio.h>int main() {FILE *fp = fopen("sample.txt", "r");if (fp == NULL) {perror("Failed to open file");return 1;}char buffer[100];size_t bytesRead = fread(buffer, sizeof(char), sizeof(buffer) - 1, fp);if (ferror(fp)) {perror("Error reading file");fclose(fp);return 1;}// 确保缓冲区以null字符结尾buffer[bytesRead] = '\0';printf("Read from file: %s
", buffer);fclose(fp);return 0;
}
在这个例子中,我们尝试从一个名为sample.txt
的文件中读取数据。如果在读取过程中发生错误,我们使用ferror
函数进行检查,并使用perror
函数打印错误信息。
示例2:使用feof
检查文件末尾
#include <stdio.h>int main() {FILE *fp = fopen("numbers.txt", "r");if (fp == NULL) {perror("Failed to open file");return 1;}int number;while (!feof(fp)) {if (fscanf(fp, "%d", &number) != 1) {// 检查是否是因为到达文件末尾而失败if (!feof(fp) && ferror(fp)) {perror("Error reading number from file");fclose(fp);return 1;}// 如果是文件末尾,则跳出循环break;}printf("Read number: %d
", number);}fclose(fp);return 0;
}
在这个例子中,我们尝试从一个名为numbers.txt
的文件中读取整数。我们使用feof
函数来检查是否已经到达文件末尾,同时使用ferror
函数来检查是否发生了其他读取错误。
十、总结
顺序读写:按照文件中数据的存储顺序依次进行读写操作,常用函数有
fprintf , fscanf , fgets , fputs
等。
随机读写:可以在文件中的任意位置进行读写操作,常用函数有
fseek , ftell , rewind
等。
错误检查:在进行文件操作时,应始终检查返回值并使用
feof
和ferror
来检测是否到达文件末尾或发生错误。
快乐的时光总是短暂,咱们下篇博文再见啦!!!不要忘了,给小编点点赞和收藏支持一下,在此非常感谢!!!
相关文章:

C语言编程笔记:文件处理的艺术
大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 本文目录 引言正文一、为什么要用文件二、文件的分…...
[创业之路-255]:《华为数字化转型之道》-1-主要章节、核心内容、核心思想
目录 前言:数字化转型对于企业而言,是一种全方位的变革 一、主要章节 1、认知篇(第1~2章)- Why 2、方法篇(第3~5章)- How 3、实践篇(第6~10章)- 实践 4、平台篇(第…...

《汽车维修技师》是什么级别的期刊?是正规期刊吗?能评职称吗?
问题解答: 问:《汽车维修技师》是不是核心期刊? 答:不是,是知网收录的正规学术期刊。 问:《汽车维修技师》级别? 答:省级。主管单位:北方联合出版传媒(…...

2024 京东零售技术年度总结
每一次回望,都为了更好地前行。 2024 年,京东零售技术在全面助力业务发展的同时,在大模型应用、智能供应链、端技术、XR 体验等多个方向深入探索。京东 APP 完成阶段性重要改版,打造“又好又便宜”的优质体验;国补专区…...

PyTorch使用教程(8)-一文了解torchvision
一、什么是torchvision torchvision提供了丰富的功能,主要包括数据集、模型、转换工具和实用方法四大模块。数据集模块内置了多种广泛使用的图像和视频数据集,如ImageNet、CIFAR-10、MNIST等,方便开发者进行训练和评估。模型模块封装了大量经…...
如何在不暴露MinIO地址的情况下,用Spring Boot与KKFileView实现文件预览
在现代Web应用中,文件预览是一项常见且重要的功能。它允许用户在不上传或下载文件的情况下,直接在浏览器中查看文件内容。然而,直接将文件存储服务(如MinIO)暴露给前端可能会带来安全风险。本文将介绍如何在不暴露MinI…...

ICMP协议和ICMP重定向攻击
✍作者:柒烨带你飞 💪格言:生活的情况越艰难,我越感到自己更坚强;我这个人走得很慢,但我从不后退。 📜系列专栏:网络安全从菜鸟到飞鸟的逆袭 目录 一,ICMP基本概念二&…...

leetcode203-移除链表元素
leetcode203 什么是链表 之前不懂链表的数据结构,一看到链表的题目就看不明白 链表是通过next指针来将每个节点连接起来的,题目中给的链表是单向链表,有两个值,一个val表示值,一个next:表示连接的下一个…...
Rust 中构建 RESTful API
在 Rust 中构建 RESTful API,你可以选择几个不同的框架。每个框架有不同的特点、优缺点和适用场景,下面我将介绍几个常用的 Rust Web 框架,并分析它们的优缺点。 Actix Web 简介: Actix Web 是一个非常高性能的 Web 框架…...

Sqlmap入门
原理 在owasp发布的top10 漏洞里面,注入漏洞一直是危害排名第一,其中数据库注入漏洞是危害的。 当攻击者发送的sql语句被sql解释器执行,通过执行这些恶意语句欺骗数据库执行,导致数据库信息泄漏 分类 按注入类型 常见的sql注入…...

迈向 “全能管家” 之路:机器人距离终极蜕变还需几步?
【图片来源于网络,侵删】 这是2024年初Figure公司展示的人形机器人Figure 01,他可以通过观看人类的示范视频,在10小时内经过训练学会煮咖啡,并且这个过程是完全自主没有人为干涉的! 【图片来源于网络,侵删】…...

移动端 REM 适配
移动端 REM 适配 Vant 中的样式默认使用 px 作为单位,如果需要使用 rem 单位,推荐使用以下两个工具: postcss-pxtorem 是一款 postcss 插件,用于将单位转化为 remlib-flexible 用于设置 rem 基准值 下面我们分别将这两个工具配…...
逐笔成交逐笔委托Level2高频数据下载和分析:20241230
逐笔委托逐笔成交下载 链接: https://pan.baidu.com/s/11Tdq06bbYX4ID9dEaiv_lQ?pwdcge6 提取码: cge6 Level2逐笔成交逐笔委托数据分享下载 利用Level2的逐笔交易和委托数据,这种以毫秒为单位的详细信息能揭露众多关键信息,如庄家意图、伪装行为&…...

C#实现字符串反转的4种方法
见过不少人、经过不少事、也吃过不少苦,感悟世事无常、人心多变,靠着回忆将往事串珠成链,聊聊感情、谈谈发展,我慢慢写、你一点一点看...... 1、string.Reverse 方法 string content "Hello World";string reverseStri…...
UDP 单播、多播、广播:原理、实践
一、引言 在计算机网络通信领域,UDP(User Datagram Protocol,用户数据报协议)是一种重要的传输层协议。它以无连接、低开销的特点,在众多实时性要求高的应用场景中发挥关键作用。UDP 支持单播、多播和广播三种通信模式…...
深入浅出:Go语言中的bytes包与字节串操作详解
标题:深入浅出:Go语言中的bytes包与字节串操作详解 引言 在Go语言的世界里,bytes包是一个非常重要的标准库,它为开发者提供了高效处理字节切片(byte slice)的功能。无论是处理二进制数据、UTF-8编码的字符串,还是进行高效的数据读写操作,bytes包都扮演着不可或缺的角色…...

数据库存储上下标符号,sqlserver 2008r2,dm8
sqlserver 2008r2: 数据类型需要用nvarchar插入数据时字符串前需要用N create table test( col1 varchar(50), col2 nvarchar(50) ) insert into test(col1,col2) values(U⁴⁵⁶⁷⁸⁹⁰D₁₂₃₄₅₆₇₈₉₀,U⁴⁵⁶⁷⁸⁹⁰D₁₂₃₄₅₆₇₈₉₀) insert into…...

LabVIEW串口通信调试与数据接收问题
在使用LabVIEW进行串口通信时,常常会遇到无法接收数据的情况。这可能与串口设置、连接、设备响应等多方面因素相关。本文将详细讨论如何使用LabVIEW进行串口通信,并提供常见问题的排查与解决方法,帮助用户更高效地进行数据接收调试。通过调整…...
oneplus3t-lineage-14编译-android7
lineageOS-14(android7)的开发者模式/usb调试(adb)有root功能, 而lineageOS-16(android9)无 oneplus3t-lineage-14编译-android7 1 清华linageos镜像 x lineage-14.1-20180223-nightly-oneplus3-signed.zip ntfs分区挂载为普通用户目录 , ext4分区挂载为普通用户目录 bfs…...

存储过程(SQL)
1.存储过程 存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。 2.MySQL存储过程创建…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...

c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...

毫米波雷达基础理论(3D+4D)
3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...
uniapp 实现腾讯云IM群文件上传下载功能
UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中,群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS,在uniapp中实现: 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...

Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合
作者:来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布,Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明,Elastic 作为 …...