我在做一个文件传输保存功能,c/s结构。s是多线程结构。每一包数据在一个线程中处理,比如文件总大小60K,则需在60个线程处理,每个线程用fpen(..., "w");得到FILE结构,是有序的,所以是线程1创建并打开文件,线程2(包括后面的线程,如果有的话)打开文件。
文件包传输中添加了文件序号,我通过文件序号seq*1000 来设定文件的偏移,例如:fseek(fp,seq*1000,SEEK_SET);
.通过偏移将每包数据写到相应的位置。避免C/S结构发送文件包时,包顺序发生错乱而要进行的队列操作。
问题呈现:
1、 文件20k,保存下来仅有2k大小。
2、修改后之后文件大小存储正常,数据仅有最后一包正确,其他数据为0x0000.
解决步骤:
1、 在打开文件时,加锁,fwrite之后fclose,并释放锁。
2、 修改文件打开的权限为fopen(fileName, "a+"),并在fwrite后使用fflush(fp)刷出流。
分析总结:
1、 在打开文件时,使用"w"会导致清除fp之前的内容。
2、 在写时,使用fflush及时刷新流,