C语言中fwrite函数怎么用输入时会覆盖文件以前的数据吗?

最近在看国嵌的嵌入式视频必修实验中的一个作业引起了我的兴趣:用库函数实现文件的复制

所以这几天都在写程序,虽然遇到不少问题不过也算是学习的一点经历,因此写博来总结一下

一、在判断目标文件是否存在时,利用access(argv[2],F_OK)==-1进行判断结果无论目标文件存在与否都会认定目标文件存在(输入参数為目标文件所在的目录的绝对路径)。

:后来写了个测试程序发现access这个函数对目录也适用,所以即使是输入参数是目标文件所在目录所以程序认为目标文件存在(Linux:大哥,这个文件(目录)是真的存在啊!。。)所以怀疑Linux也把目录视为文件(在

 中说到:“甚至目錄也是文件”)。

解决:利用stat函数获取路径所指文件属性加以判断即可。

——————————————————————————————————————————————————————————————————————————————

二、用while(!feof(sfile))判断源文件是否已经到达末尾时发现拷贝好的文件末尾总是会多出一些乱码,而且乱码大小正好等于真正数据的大小同时报错segfault.

:上网查找资料才明皛,

在读完最后一个字符后fp->flag仍然没有被置为_IOEOF,因而feof()仍然没有探测到文件结尾直到再次调用fgetc()执行读操作,feof()才能探测到文件结尾所以程序多执行了一次fread
fwrite,但是由于fread读到的数据早已超过了源文件所以写入的数据是乱码,同时触发segfault错误

解决:将fwrite函数怎么用提前,获取源文件长度并比较目标文件与源文件长度,作为循环判断条件每写完一段数据,两者长度比较

——————————————————————————————————————————————————————————三、当输入参数是绝对路径时,需要获取源文件名称并叠加到目标文件路径中获取文件名时需要对argv这个指针数组进行操作,如何引用指针数组中某个指针指向的字符串中的字符

i)的方式获取字符,结果在gdb里调试返回的是数字应该是对指针数组理解错误了,我以为*argv[1]既然是字符串首地址那+1就是指向下一个字符,經过gdb测试发现*argv[1]+1返回的数值是字符串第一个字符的ASCII码+1,而argv[1]+1返回的是字符串第二字符到末尾随后写了个测试程序,可以通过*argv[1]
+ i 的形式获取传叺参数字符串中的某个字符不过这种表示方式从原理上是好理解的,后来我直接用argv[1][i]的形式获取这个看着更加习惯(实际上这些都是属於指针数组的知识点,包括多维数组、字符串数组、二维数组这些数组本质上都是指针数组的不同表现,所以以后看到指针数组直接鼡arr[i][j]这种形式引用任意一个元素即可。)

——————————————————————————————————————————————————————————

四、前一天改动过变量第二天在用fwrite写入数据时发现,目标文件末尾还是出现了一段乱码

原因:经过gdb调試发现fwrite(buffer,sizeof(char),file_len,dfile)中的file_len写错,应该是tmp_len因为前一天改动程序时,添加了tmp_len变量存储文件长度忘了将fwrite中的参数改过来,所以在最后一次copy数据段的时候会拷进file_len大小的数据,而是实际上应该是要拷进tmp_len大小的数据(tmp_len在每次拷贝都会减小)

解决:替换变量名即可。

该楼层疑似违规已被系统折叠 

各位大神我有个疑问如果用w方式打开文件,该文件中有数据abc那么直接用fprintf函数或者fwrite函数怎么用会覆盖掉嘛?也就是说再次打开文件指针指哪里啊开头还是数据abc后


我要回帖

更多关于 fwrite函数怎么用 的文章

 

随机推荐