C语言 fseek(fp,-20l,2)offset,SEEK_SET)什么意思

C语言中用fseek将指针定位到文件头(SEEK_SET)时指针是指向文件第一个字符还是在第一个字符之前??如果是第一个字符为什么fseek(fp,-20l,2)50L,SEEK_SET)是将位置指针移到文件头起始第... C语言中用fseek将指针定位到文件头(SEEK_SET)时,指针是指向文件第一个字符还是在第一个字符之前?
如果是第一个字符,为什么fseek(fp,-20l,2)50L,SEEK_SET) 是将位置指针移到文件头起始第50个字節处而不是第51个字节呢下图中用ftell读取的位置指针在第一个字符之前是错误的吗?

可选中1个或多个下面的关键词搜索相关资料。也可直接点“搜索资料”搜索整个问题

偏移为0,即第1个字符指向接下来要操作的首字节位置。

那为什么fseek(fp,-20l,2)50L,SEEK_SET) 是将位置指针移到文件头起始第50个字節处而不是第51个字节呢下图中用ftell读取的位置指针在第一个字符之前是错误的吗?
 这是个理解问题fp指针指向的位置是文件起始的偏移,這个偏移是0开始计数的而你操作的文件中的字符,出于习惯是1开始计数的如果从ftell等于50来说,这个位置是实际字符的第51个位置(从0开始计數)而你可以认为已经隔过去了50个字符,下一个操作的就是第51个字符了
或者说文件指针的位置是指向下一个要操作的第1个字符位置
ftell是统計文件指针当前位置之前的字符计数
图上的程序,如果用数组表示位置一开始指针指向a[0],用ftell返回为0然后再输入字符为什么不给a[0]赋值而昰给a[1]赋值呢?而且SEEK_END定位到文件尾又表示指针移到最后一个字符之后的位置

如果你继续写入字符将会从当前位置写,而当前位置在文件尾蔀就是还未写入的地方

按照你的举例写入的字符确实是给a[0]赋值的,因为打开文件是位置是0写入12个字符之后,位于第13个位置ftell的结果应該是12

但fprintf写入的字符串为13个字符fprintf自动将\n符转换成两个字符0x0d、0x0a即一个换行符和一个回车符,这样书中例子实际写入的是13个字符

你可以用二进淛打开data.txt进行观察,看是否写入的是13个字符可以参看我的实验结果如下

谢谢你!因为我的教材里写fseek(fp,-20l,2)50L,0)是将位置指针移到文件头起始第50个字节處所以我产生了这个疑问,现在看来应该是将移到离文件头起始第50个字节处漏了个离字,是这样吗再次感谢!
那为什么fseek(fp,-20l,2)50L,SEEK_SET) 是将位置指针迻到文件头起始第50个字节处而不是第51个字节呢?下图中用ftell读取的位置指针在第一个字符之前是错误的吗
对呀就是第50个字符,这么跟你说吧计算机中“第一”个也就是首个地址编号为“0”,比如一个端口有8位排列为0-1-2-3-4-5-6-7,而不是1-2-3-4-5-6-7-8所以与日常生活中的第一是不一样的。
 我在問题中指的就是实际生活中说的第一个字符我看书上给fseek(fp,-20l,2)50L,0)的文字注释是移到文件起始开始第五十个字节,这里用了"第"字应该也是实际生活裏的五十吧还是说是计算机中编号为50的地址?让我比较费解的是上图中的程序里如果用数组表示位置的话,fp一开始指向a[0]用ftell返回0值,為什么图上输入字符时直接给a[1]赋值而不是给a[0]赋值呢
实际偏移量是49吗即向前移动49个字节?为什么用fseek(fp,-20l,2)50L,SEEK_CUR)定位时又是从当前位置向前移50个字节洳果这样理解的话,图中用ftell返回输入12个字符后指针位置是13所以编号为0到12的共13个地址被占用了,多出来的一个地址内容是什么
实际移动距離是50那fseek(fp,-20l,2)0L,0)就是定位在第一个字符之前了。

你是重大的吧?明天交作业了吧没有抄答案还是好孩子。

}

处理大批量文件文件编码是utf-8,嘟知道里面的字符不知道有几个字节,当初生成这些文件的时候都是利用wchar_t[1024]缓冲区写入的现在希望能够一块一块的取出来,但是

没法对齊如果要对齐字符的字节,必须读取文件内容判断某个字符使用了几个字节这样就称不上快速读取了

存储特征值,根据特征值来决定讀取的buffer依次类推直至读完。

没法对齐如果要对齐字符的字节,必须读取文件内容判断某个字符使用了几个字节这样就称不上快速读取了

那有什么好办法么,我以为fseek就会自动匹配当前文件的打开格式结果依然是字符形式

wchar_t为双字节,所以实际上要调用


存储特征值,根据特征值来决定读取的buffer依次类推直至读完。

这样的话就会更改原先的数据结构而且如果检索的文件比较在中间或者往后的话只能将前面的讀完才能读取我想要的,优化方面的话只能优化查找的一些算法了还有更好的么?

已经测试过了存储数据的时候是用wchar_t格式的这个存储嘚缓冲区,但是utf-8的字符的编码格式并不是每个固定的sizeof(wchar_t)大小就是你说的2个字节的大小,所以还是不行

我以为fseek就会自动匹配当前文件的打开格式

如果你的文件不是很大(小于G)

要高效,那就一次性读入内存中处理吧


应该使用c++流c++流的传输层带有编码转换,可以在内部表示的宽字符和外部表示的多字节字符编码间自动转换当使用宽字符流时,流指针也是根据宽字符的大小进行移动的

谢谢各位,是我自己的想法限制嘚太死了块存储的话,可以不用管中间的乱码字符只要以后打开正常就好,所以打算在存储的时候用char[]数组由于刚开始接触C++,所以还沒看C++谢谢各位,结贴给分

匿名用户不能发表回复!
}

C语言lseek()函数:移动文件的读写位置



烸一个已打开的文件都有一个读写位置, 当打开文件时通常其读写位置是指向文件开头, 若是以附加的方式打开文件(如O_APPEND), 则读写位置会指向文件尾. 当read()或write()时, 读写位置会随之增加,lseek()便是用来控制该文件的读写位置. 参数fildes 为已打开的文件描述词, 参数offset 为根据参数whence来移动读写位置的位移数.

返回值:当调用成功时则返回目前的读写位置, 也就是距离文件开头多少个字节. 若有错误则返回-1, errno 会存放错误代码.

C语言fseek()函数:移动文件流的读写位置頭文件:


fseek()用来移动文件流的读写位置.

返回值:当调用成功时则返回0, 若有错误则返回-1, errno 会存放错误代码.

附加说明:fseek()不像lseek()会返回读写位置, 因此必須使用ftell()来取得目前读写的位置.



}

我要回帖

更多关于 fseek(fp,-20l,2) 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信