首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

文件操作详解

为什么使用文件 我们前面学习结构体,写通讯录的程序,通讯录运行起来的时候,可以给通讯录增加、删除数 据,此时数据是存放在内存程序退出的时候,通讯录的数据自然就不存在了,等下次运行通讯...本章讨论的是数据文件;以前各章所处理数据的输入输出都是以终端为对象的,即从终端的键盘输入数据,运行结果显示显示器上;其实有时候我们会把信息输出到磁盘上,需要的时候再从磁盘上把数据读取到内存中使用,...如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘占用5个字节(每个字符一个字节),二进制形式输出,则在磁盘上只占4个字节(VS2013测试)。...EOF) // 标准C I/O读取文件循环 { putchar(c); } //判断是什么原因结束的 if (ferror(fp))//ferror是读取结束之后用来判断是不是因为发生了错误读取结束的...); printf("刷新缓冲\n"); fflush(pf);//刷新缓冲,才将输出缓冲的数据写到文件(磁盘) //注:fflush 高版本的VS上不能使用了 printf("再睡眠

12810

C语言——P文件操作

以前各章所处理数据的输⼊输出都是以终端为对象的,即从终端的键盘输⼊数据,运⾏结果显示显示器上。...⼀般情况,我们要想向流⾥写数据,或者从流读取数据,都是要打开流,然后操作。 b.标准流 那为什么我们从键盘输⼊数据,向屏幕上输出数据,并没有打开流呢?...• stdout-标准输出流,大多数的环境输出至显示器界面,printf 函数就是将信息输出到标准输出流。 • stderr-标准错误流,大多数环境输出到显示器界面。...缓冲的大小根据C编译系统决定的 #include #include //VS2019 WIN11环境测试 int main() { FILE* pf =...\n"); Sleep(10000); printf("刷新缓冲\n"); fflush(pf);//刷新缓冲,才将输出缓冲的数据写到⽂件(磁盘) //注:fflush ⾼版本的VS上不能使

12110
您找到你想要的搜索结果了吗?
是的
没有找到

文件操作(File Operations)

注:以前所处理数据的输入输出都是以终端为对象的,即从终端的键盘输入数据,运行结果显示显示器上.其实有时候我们会把信息输出到磁盘上,需要的时候再从磁盘上把数据读取到内存,那么这里我们处理的就是磁盘上的文件...2.Unix和Linux所有的文本文件行都是 \n 结尾,Windows所有的文本文件行都是 \r\n 结尾         3.Windows平台下,以“文本”方式打开文件,不加b:                ...end of file),while循环中以EOF作为文件结束标志,这种以EOF作为文件结束标志的文件,必须是文本文件,文本文件,数据都是以字符的ASCII码值的形式存放,ASCII码值的范围是...[j] > src[j + 1]) { int tmp = src[j]; src[j] = src[j + 1]; src[j + 1] = tmp; } }..."); fflush(pf);//刷新缓冲,才将输出缓冲的数据写到文件(磁盘) 注:fflush 高版本的VS上不能使用了 printf("再睡眠10秒-此时,再次打开test.txt文件

52310

确定不进来看看吗?详细讲解C语言文件操作(示例分析每个函数)

文件指针: 首先我们介绍一文件指针,每个被使用的文件都在内存开辟了一个相应的文件信息,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量的。...我们使用文件,要先将这个文件打开,并且结束后将文件关闭....(很重要) 如果我们需要进行数据交换的对象是显示器,文件,网络,打印机等输出设备,我们需要了解每一个对象的读写方式吗?这未免也要麻烦了,对操作人员的要求是不是也很高?...注意: 该函数按行进行写入字符串.可以写数据在后面增加一个换行符,会更加美观....因为有缓冲的存在,C语言操作文件的时候,需要做刷新缓冲(flush函数)或者文件操作结束的时候关闭文件。 如果不刷新,可能导致读写文件的问题 如果文章对大家有用的话记得一键三连哦!

60320

【C语言】万字文件操作总结

以前各章所处理数据的输入输出都是以终端为对象的,即从终端的键盘输入数据,运行结果显示显示器上。...tmp sscanf(buf,"%s %d %f", tmp.arr, &(tmp.age), &(tmp.score)); printf("格式化:%s %d %f\n", tmp.arr, tmp.age...如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘占用5个字节(每个字符一个字节), 二进制形式输出,则在磁盘上只占4个字节 测试代码: #include int...(pf); pf = NULL; return 0; } 打开文件发现看不懂: 我们可以通过VS进行二进制编辑器打开方式: 文件读取结束的判定 牢记:文件读取过程,不能用feof函数的返回值直接用来判断文件的是否结束..."); fflush(pf);//刷新缓冲,才将输出缓冲的数据写到文件(磁盘) //注:fflush 高版本的VS上不能使用了 printf("再睡眠10秒-此时,再次打开test.txt

53320

Linux环境基础开发工具

gcc test.c」 即可在vim编译.c文件 vim 的分屏 「: vs + 文件名」: 如在 test.c 打开或创建一个文件「: vs liren.c 」 「ctrl + w」...在这个阶段,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,检查无误后,gcc 把代码翻译成汇编语言。...其后缀名一般为 “.a” 动态库与之相反,在编译链接并没有把库文件的代码加入到可执行文件,而是程序执行时由运行时链接文件加载库,这样可以节省系统的开销。...mytmp 依赖于 tmp.c 为主,更加简洁 依赖方法: 上面例子的 gcc -o mytmp tmp.c 就是依赖方法 原理 make 是如何工作的,默认的方式,也就是我们只输入...% 128 与 num & 127 相较,则明显&127更加轻量 5、死代码删除是编译最优化技术,指的是移除根本执行不到的代码,或者对程序运行结果没有影响的代码不是删除被注释的代码

1.8K50

C进阶:文件的基础操作

下面是 vs2013编译环境提供的 stdio.h 头文件中有以下的文件类型申明: struct _iobuf { char *_ptr; int _cnt; char *...读取 (n-1) 个字符,或者读取到换行符,或者到达文件末尾,它会停止,具体视情况而定; 2.参数 char *str :这是指向一个字符数组的指针,该数组存储了要读取的字符串; 3.参数...[20] = { 0 }; printf("%s\n", fgets(tmp, 20, pfread)); //将读取到的字符串存入 tmp ,并打印 fclose(pfread); //关闭文件...Sleep(10000); printf("刷新缓冲\n"); fflush(pf);//刷新缓冲,才将输出缓冲的数据写到文件(磁盘) //注:fflush 高版本的VS...,也会刷新缓冲 pf = NULL; return 0; } 结论: 因为有缓冲的存在,C语言操作文件的时候,需要做刷新缓冲或者文件操作结束的时候关闭文件。

9610

VS Code教程(JSON)

但是,也可以VS Code工作的文件以及VS Code设置文件定义架构。...可以使用$schema属性JSON文件本身,也可以属性的用户或工作设置(文件 > 首选项 > 设置)完成JSON文件与模式的关联json.schemas。...label并将description显示完成选择对话框。如果未提供标签,则代码段的字符串化对象表示将显示为标签。 body是当用户选择完成被字符串化并插入的JSON对象。...执行一 对当前文件夹进行精细化操作,UI界面里面更改了两个设置,实时的反映到了json文件里面. ---- 但是对当前工作区区域的更改并没有反应到这个文件,但是他是反映到 这个文件 但是这个工作的...json并不是在当前工作木中保存而是appdata的文件夹里面 尝试工作命名为中文名字.报错.这个地方不是报错,就是我也不知道怎么回事,你关闭编辑器,重新打开试试.

5.2K10

c语言基础学习09_复合类型

vs2017示例代码如下: 1 #include 2 3 struct A 4 { 5 char a1; 6 }; 7 8 struct B 9 {...vs2017示例代码如下: 1 #include 2 #include 3 #pragma warning(disable:4996) 4 5...2、typedef是编译器处理的,不是预编译指令。   3、typedef比#define更灵活。...一个项目做得特别大,做完后还得需要去维护、去升级、去修改。   微软一开始就把代码写的很优秀,一开始就把c语言能用的构架都给用了,那么最后再去维护代码的时候,就会很容易。   ...他们不是必须的,但是有的时候有了这些构架后,会发现工作效率会提升很多,所以换个角度说,这些前期工作有时必须的。   我们写程序时,既要实现功能本身,又要有高效的产出。

92010

【C进阶】—— 一篇文章带你学会C语言的文件操作

以前我们所处理数据的输入输出都是以终端为对象的,即从键盘输入数据,运行结果显示显示器(屏幕)上。...sscanf是从字符串读取格式化数据,所以参数还是字符指针。 好,那我们接着刚才上面写的代码,把写入字符串的数据再还原到一个结构体变量。...如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘占用5个字节(每个字符一个字节),二进制形式输出,则在磁盘上只占4个字节(VS2013测试)。...有的,我们可以借助vs查看: 将这个文件添加到vs2022; 右键选择打开方式,以二进制编辑器的方式打开 我们知道vs上是小端存储模式,变成00 00 27 10 是不是跟我们上面分析的一样...下面有一段代码,可以让我们感受一缓冲的存在: #include #include //VS2022 WIN10环境测试 int main() { FILE

16210

C语言—部分库函数的模拟实现

注意:这里使用了无符号字符指针,是因为以有符号字符指针相减得到的结果会因为符号位的影响不稳定。...函数,使用 while 循环找到 dest 字符串的末尾,然后再使用 while 循环将 src 的字符复制到 dest 的末尾,直到遇到 '\0'(字符串结束符)。...如果目标区域源区域前面且两个区域有重叠,就需要借助临时缓冲。 具体实现步骤如下: 将void类型的dest和src指针强制转换为char类型的指针,方便进行指针位移操作。...判断是否需要借助临时缓冲。如果目标区域源区域前面且两个区域有重叠,就需要借助临时缓冲。这时,先申请一个大小为n的临时缓冲tmp,并将src的数据拷贝到tmp。...模拟实现strlen trlen函数用于计算字符串的长度(不包括字符串末尾的'\0'), 以下是C语言模拟实现strlen的代码: #include int my_strlen(const

8210

C和C++安全编码复习

恶意代码把栈的返回代码修改成调用其它函数,甚至是系统某些命令的代码,导致该程序退出之前把本身具有的权限交给了这些命令,从而引发最严重的安全问题....派生类里的析构函数一般会用于析构其内部的子对象,这样就可能会造成内存泄漏。 错误示例:代码的析构函数没有被定义成虚函数。...但源内存和目标内存存在重叠,memcpy会出现错误,memmove能正确地实施拷贝,但这也增加了一点点开销。...memmove的处理措施:  源内存的首地址等于目标内存的首地址,不进行任何拷贝  源内存的首地址大于目标内存的首地址,实行正向拷贝  源内存的首地址小于目标内存的首地址...因为这块内存可能已经被其他部分代码申请走,内容可能已经被修改;直接修改释放的内存,可能会导致其他使用该内存的功能不正常;读也不能保证数据就是释放之前写入的值。一定的情况,可以被利用执行恶意的代码

2.1K10

希尔排序原理

3、然后待排序重复2的步骤向已排序从后往前比较,找到合适位置插入。 4、 继续将待排序元素插入到已排序待排序元素为0,这组数据就已经排序完成。...4、一直刷新end与tmp值,与已排序进行从右往左的比较,比较到合适的位置才进行插入,不是每次比较都插入元素。 时间复杂度:最坏情况下为 O(N^2),此时待排序列为逆序,或者说接近逆序。...代码实现: #include #include #include #include void InsertSort(int...然后,再取gap/2个组(缩小增量),重复上述分组和排序的工作gap == 1所有记录在统一组内排好序。...2、gap > 1,都是预排序,目的是让数组更接近有序,gap==1,将前面预排序的结果进行直接插入排序完成排序。

10910

【C语言】超详解strncpy&&strncat&&strncmp&&strerror&&perror的使⽤和模拟实现

strcpy、strcat这类函数不安全,因为它们复制字符串不检查目标缓冲的大小,可能会导致缓冲溢出。...strncpy、strncat、strncmp这类函数相对来说更安全,因为它们复制/追加字符串时会限定最大长度参数n,避免无限制地写入目标缓冲。...点击—>手把手教你配置VS的常见函数如何不报错! 库函数strncpy strncpy函数用于将一个字符串拷贝到另一个字符串,可以限定拷贝的字符数。...因此,使用strncmp函数,需要确保n的值不会超过任意一个字符串的长度。 strncmp函数返回的结果是一个整数,可以通过结果的正负值来判断两个字符串的大小关系。...当我们使⽤标准库的函数的时候发⽣了某种错误,就会讲对应 的错误码,存放在errno 以每⼀个错误码都是有对应的错误信息的 strerror函数返回的是一个静态字符串指针,不需要手动释放内存。

16610

【C语言】getchar 函数的正确使用

1、全缓冲 在这种情况填满标准I/O缓存后才进行实际I/O操作。全缓冲的典型代表是对磁盘文件的读写。 2、行缓冲 在这种情况,当在输入和输出遇到换行符,执行真正的I/O操作。...---- 三、getchar 函数的正确使用 1、getchar 的换行问题 我们来观察下面这段代码 #include int main() { int ch = 0;...,当我们用getchar读取字符,会从缓冲依次逐个读取所有的字符(包括换行、空格、Tab),直到缓冲没有数据,每读取一个字符就用putchar打印一,所以这里会自动换行。...---- 2、getchar 与 scanf 的混合使用 我们来观察下面这段代码: #include int main() { char password[20] = { 0...abcdef\n,scanf函数是遇到空格、换行符(\n)、Tab结束,所以\n并没有被读取走,而是继续留在了缓冲getchar读取数据发现缓冲并不为空,所以直接读取了\n,然后判断

1.2K50

【Linux】常用工具()

windows 操作系统,比如 vs2019 这款编译器,有了图形化界面,我们可以直接一键生成解决方案,即编译;但在 Linux 系统,需要我们使用 gcc 或 g++ 手动进行编译工作,当我们需要编译的文件多起来时...其实上面的现象程序执行 printf 后,printf 打印的内容被存放到缓冲 C/C++ ,会针对标准输出,给我们提供默认的缓冲,而在缓冲没有被刷新之前,我们的内容就不会被输出。...工作就是我们写代码的目录;暂存就是我们使用 git add 后代码暂存的区域;版本库就是从暂存提交后(即git commit)所在的区域。...当我们工作需要将我们的代码送到远程仓库,首先先要将我们的代码 git add 到暂存,此时我们需要执行 git add 命令,如下图: 仅需要执行这一句命令,就可以使工作的 study5 送到暂存... vs ,我们可以使用 F10 和 F11 进行逐过程和逐语句的调试,gdb 我们也可以使用这样的操作,其中逐过程是 n,即 vs 的 F10;逐语句是 s,即 vs 的 F11.

17610

C的全缓冲、行缓冲和无缓冲

缓冲类型 宏 全缓冲 _IOFBF 行缓冲 _IOLBF 无缓冲 _IONBF 在学习APUE这本书,程序8-1,就很好的体现了全缓冲和行缓冲的区别,代码如下: #include <stdio.h...(显示器),是行缓冲,遇到换行符时会将缓冲区内容输出到显示器,并清空缓冲。...使用重定向命令,标准输出被重定向到磁盘文件,此时标准输出变成全缓冲,遇到换行符不输出,而是被拷贝至子进程父子进程结束后,各有一份输出。...setvbuf(stream,NULL,_IOLBF,0); //实测,VS2015,size需要大于0,且只能设为全缓冲 //上面的代码等价于 setlinebuf(stream);...存在缓冲的前提下,改变缓冲模式用setvbuf()。注意,不能使用setvbuf()来间接申请缓冲,只能显示指明缓冲

3.1K20

字符串函数、字符函数、内存函数的使用及其模拟实现

为0,说明将src的结束字符赋给了dest,这种情况源字符串的长度小于num { while (num--) { //如果源字符串的长度小于num,则拷贝完源字符串之后,目标的后边追加...strerror 函数功能 C语言有一系列的库函数,这些库函数调用失败,会返回相应的错误码,strerror函数的作用就是获取错误码对应的错误信息的首地址,让使用者知道程序发生错误的原因。...强转为char*类型后赋值 //这里不要写成(char*)dest++,某些编译器会报错,因为强制类型转是一种临时效果 dest = (char*)dest + 1; src...1,导致将arr[2]的数据赋给arr[4]不是4,而是1),但是VS的memcpy函数是具备拷贝重叠数据的能力的,也就是说,VS的memcpy函数同时实现了memmove函数的功能,但是其他编译器的...代码实现: #include #include void* my_memmove(void* dest, void* src, size_t num) {

1.9K00

Linux进程控制

CPU现场保护进程因某种原因不能继续占用CPU,释放CPU,需要将CPU的各种状态信息保护起来。 进程同步与通信机制:用于实现进程间互斥、同步和通信所需的信号量等。...当前进程数已达系统规定的上限,此时errno的值被设置为EAGAIN 系统内存不足,此时errno的值被设置为ENOMEN errno是Linux的一个宏定义常量,LinuxC API函数发生异常...count的值,变为2,父进程count值也为2,说明父子进程共享count,即父子进程共享内存。...,子进程,因为_exit(0)直接将缓冲的内容清除了,内容没有显示父进程,执行exit(0)之前会先将缓冲的内容显示出来。...: 宏定义 含义 WIFEXITED(status) 子进程正常退出,返回一个非零值,否则返回零 WEXITSTATUS(status) WIFEXITED为真,此宏才可用,返回该进程退出的代码

2K30
领券