当前位置:  开发笔记 > 开发工具 > 正文

FILE结尾*指针不等于写入数据的大小

如何解决《FILE结尾*指针不等于写入数据的大小》经验,为你挑选了1个好方法。

非常简单地说,我有以下代码片段:

FILE* test = fopen("C:\\core.u", "w");
printf("Filepointer at: %d\n", ftell(test));
fwrite(data, size, 1, test);
printf("Written: %d bytes.\n", size);
fseek(test, 0, SEEK_END);
printf("Filepointer is now at %d.\n", ftell(test));
fclose(test);

它输出:

Filepointer at: 0
Written: 73105 bytes.
Filepointer is now at 74160.

这是为什么?为什么写入的字节数与文件指针不匹配?



1> paxdiablo..:

由于您在文本模式下打开文件,它会将行尾标记(如LF)转换为CR/LF.

如果你在Windows上运行(这可能是你的文件名开头"c:\"),这很有可能.

如果你在"wb"模式下打开文件,我怀疑你会发现数字是相同的:

FILE* test = fopen("C:\\core.u", "wb");

C99标准有这样的说法7.19.5.3 The fopen function:

参数模式指向一个字符串.如果字符串是以下之一,则文件以指示的模式打开.否则,行为未定义.

r打开文本文件,用于读取
w截断为零的长度或创建用于写入
a追加的文本文件; 打开或创建用于在文件结束时
rb打开二进制文件写入的文本文件,用于读取
wb截断为零的长度或创建用于写入
ab追加的二进制文件; 打开或创建二进制文件,用于在文件结束时
r+打开文本文件,以便更新(读取和写入)
w+截断为零长度或创建文本文件以进行更新
a+附加; 打开或创建文本文件以进行更新,在文件结束时写入
r+brb+打开二进制文件以进行更新(读取和写入)
w+bwb+截断为零长度或创建二进制文件以进行更新
a+bab+追加; 打开或创建二进制文件以进行更新,在文件结尾处写入

你可以看到他们区分wwb.我不相信的实现,则需要治疗两个不同但它通常是安全使用二进制模式的二进制数据.

推荐阅读
低调pasta_730
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有