这是在写一个文件的的时候发生的一个错误,代码如下

 #include<stdio.h>
#include <errno.h>
#include <string.h> int main(){
FILE * fp; char t = ;
for (int i = ; i <= ; i++)
{
fp = fopen("test.txt" , "ab");  
t = i;
if ( == i)
continue; if (fseek(fp, (i - ) * , SEEK_SET))
printf("i = %d errno = %d(%s)",i, errno, strerror(errno));
printf("当前位置:%d ", ftell(fp) / );
printf("文件结束符%d\n", feof(fp));
for (int j = ; j < ; j++)
fwrite(&t, , , fp);
fclose(fp);
}
fp = fopen("test.txt", "ab");
t = ;
fseek(fp, ( - ) * , SEEK_SET);
printf("当前位置:%d ", ftell(fp) / );
printf("文件结束符%d\n", feof(fp));
for (int j = ; j < ; j++)
fwrite(&t, , , fp);
fclose(fp); return ;
}

按照常理来说,这样的写入文件会按照顺序写入100个1024的字符,但是结果是在写到55号块(对应ASCI字符37)时并没有写入而是直接写入56号块(38) ,37是写在文件的最后的。

打印出来的ftell和feof()的信息是这样的

...
当前位置: 文件结束符0
当前位置: 文件结束符0
当前位置: 文件结束符0
当前位置: 文件结束符0
当前位置: 文件结束符0
当前位置: 文件结束符0
当前位置: 文件结束符0
当前位置: 文件结束符0
...
当前位置: 文件结束符0
当前位置: 文件结束符0
当前位置: 文件结束符0
当前位置: 文件结束符0
当前位置: 文件结束符0
当前位置: 文件结束符0

也就是说每次fseek其实是改变了文件指针,但是feof()却始终为0;原因如下;

 fseek每次其实都改变了文件指针,打印出来是对的(ftell),但是feof()却每次都是0 ,因为ab+的意思是可以读文件的所有位置但却只能在文件的末尾写入。也就是说,之前的fseek对于以a模式打开的文件来说,对读取有效,对写入是没有作用的。 

关于fseek和文件"ab+"打开方式的问题的更多相关文章

  1. Android加载SD卡目录,文件夹遍历,图片设置,设置文件对应打开方式等

    此案例主要说的是Android使用GridView加载SD卡下所有目录,文件夹多层遍历,文件图标修改,设置文件对应打开方式等功能. 如图: 代码: public class GridViewFile ...

  2. CentOS 6.4 文件夹打开方式

    CentOS 6.4 文件夹打开方式 在CentOS 6.4中,双击文件夹,默认会在新窗口中打开文件夹,没有路径.前进.后退这样的按钮,如果一个文件夹的路径很深,则需要打开n多的窗口才能找到最终想要的 ...

  3. 通过Powershell修改文件默认打开方式

    修改原理 详情: Windows下通过注册表修改某个类型文件的默认打开方式和文件图标 脚本详情: Github:Change_default_programs.ps1 描述: 至少在Windows10 ...

  4. MyEclipse设置文件默认打开方式

    MyEclipse设置文件默认打开方式 依次点击: [MyEclipse]-> [Preferences] -> [General] -> [Editors] -> [File ...

  5. 删除win10系统下文件默认打开方式的关联-win10配置

    现象 文件默认打开方式错误 链接到老的打开软件 无法图形化重定义关联软件 文件图标关联异常 1. 打开注册表编辑器 win + R regedit 2. 修改注册表 找到以下注册表路径,找到指定的文件 ...

  6. sublime 设置文件默认打开方式

    win7,sublime text 3 无法关联文件 删除 HKEY_CURRENT_USER\Software\Classes\Applications下的Sublime_Text.exe项.你就发 ...

  7. 重新关联bat文件的打开方式为系统默认方式

    为什么“BAT”扩展名的默认打开方式:显示出来的居然是“%1”这么一个怪异的东东,具体在什么位置的? c:\windowssystem32\command.com修复bat关联,打开command.c ...

  8. C++文件读写 打开方式等比较全

    要求:掌握文本文件读写的方法了解二进制文件的读写方法 C++文件流:fstream // 文件流ifstream // 输入文件流ofstream // 输出文件流 //创建一个文本文件并写入信息// ...

  9. Linux 设置文件默认打开方式

    比如说我安装了一个绿色版的sublime(.tar解压出来的不是.deb) 但是现在我右键不能打开,不能添加为默认打开方式...这个时候就比较尴尬了... 我总不能每次都cd到安装目录下然后termi ...

随机推荐

  1. Oracle corrupt block(坏块) 详解

    转自:http://blog.csdn.net/tianlesoftware/article/details/5024966 一. 坏块说明 1.1 相关链接 在看坏块之前,先看几个相关的链接,在后面 ...

  2. chrome 修改标签页

    插件名称:New Tab Redirect 标签格式:"file:///home/user/index.html"

  3. jxl 导入excel以及日期格式处理

    先建一个excel文件abc.xls.放到E盘根目录下.形如下: name secondName hot1 leave1 hot2 leave2 然后在数据库里建表. CREATE TABLE `na ...

  4. Package 'DXCore for Visual Studio' has failed to load properly

    Since installing 13.1  I get Package 'DXCore for Visual Studio' has failed to load properly error wh ...

  5. 自动以读写方式挂载ntfs-黑苹果之路

    在mac下ntfs分区总是以只读方式挂载,双操作系统,尤其有些时候需要用u盘,需要手工umount再mount,很麻烦,找了一些资料,通过修改/etc/fstab文件无效,要么就是使用第三方软件,不合 ...

  6. MSDN(电驴)

    主站: http://msdn.itellyou.cn/ 辅站: http://msdn.ez58.net/

  7. Android性能优化之:ViewStub

    ViewStub是Android布局优化中一个很不错的标签/控件,直接继承自View.虽然Android开发人员基本上都听说过,但是真正用的可能不多. ViewStub可以理解成一个非常轻量级的Vie ...

  8. com学习(五)——实现多接口

    从第五回开始到第七回,咱们用 ATL 写了一个简单的 COM 组件,之所以说简单,是因为在组件中,只实现了一个自定义(custom)的接口 IFun.当然如果想偷懒的话,我们可以把 200 个函数都加 ...

  9. 【PL/SQL练习】函数

    1.必须返回一个值2.只能在表达式调用 SQL> create or replace function fun1 return number is v_sum_sal emp.sal%type; ...

  10. 洛谷P2733 家的范围 Home on the Range

    P2733 家的范围 Home on the Range• o 26通过o 61提交• 题目提供者该用户不存在• 标签USACO• 难度普及+/提高 提交 讨论 题解 最新讨论• 暂时没有讨论题目背景 ...