Tag: fseek

fseek和SEEK_END的行为

如果我有一个文本文件,其中以下内容打开为二进制文件 1234567890 像这样的电话: fseek(fp, 5L, SEEK_SET); 当我调用(char)fgetc(fp)时给我6,因为我从字节0偏移了5个字节(不是从1开始而是从2开始) 但如果我这样做: fseek(fp, -3L, SEEK_END); 当我打电话给(char)fgetc(fp)时,给我8而不是7。 为什么? 与SEEK_END ,偏移量不会从最后一个字节后的前一个字节开始。

便携式C如何在从管道读取时向前寻找

由于fseek()在管道上不起作用,有哪些方法可以模拟前进? 天真的方法是使用fread()并将读取的内容丢弃到内存缓冲区中。 为了避免巨大的缓冲区,你只需要使用缓冲区的一部分就可以反复使用相同的缓冲区。 但这是唯一的方法吗? 有没有另一种方法可以避免缓冲区和潜在的多重读取?

在c中将数据插入文件

我需要在现有文件中的第 45 个字节之前添加一个字符串。 我尝试使用fseek ,如下所示。 int main() { FILE *fp; char str[] = “test”; fp = fopen(FILEPATH,”a”); fseek(fp,-45, SEEK_END); fprintf(fp,”%s”,str); fclose(fp); return(0); } 我期望这段代码会在EOF的第 45 个字符之前添加“test”,相反,它只是将“test”附加到EOF。 请帮我找到解决方案。 这是我之前的问题的延续 将项添加到c中最后一行之前的文件中

撤消ungetc()的效果:“如何”fseek(),rewind()和fsetpos()这样做?每次都重新填充缓冲区吗?

嗯!!我怎么能把整件事放在一个明确的问题上!!让我试试: 我知道使用fopen()打开的文件被缓冲到内存中。我们使用缓冲区来提高效率。在从文件中读取文件时,首先将文件内容读入缓冲区,然后从该缓冲区中读取。类似地,在对文件的写入中,首先将内容写入缓冲区,然后写入文件。 但是fseek() , fsetpos()和rewind() 丢弃之前调用ungetc()呢? 你能告诉我它是如何完成的吗?我的意思是,鉴于我们已经打开了一个文件进行读取并将其复制到缓冲区中。现在使用ungetc()我们已经更改了缓冲区中的一些字符。这就是我刚才失败的地方即使经过多方努力也能理解 以下是关于ungetc()说法 – “对fseek,fsetpos或fwindpos的调用会丢弃之前使用此函数重新放入其中的任何字符。” – 如何放弃已放入缓冲区的字符?一种方法是删除被删除的原始字符,并将每个放入的新字符识别并替换为原始字符。但这似乎效率很低。另一种选择是将原始文件的副本加载到缓冲区中,并将文件指针放在预期的位置。这两个方法的fseek,fsetpos或rewind采取放弃使用ungetc()放置的字符? 对于文本流,流中未读字符的存在,使用ungetc()放入的字符如何影响ftell()的返回值?我的混淆来自关于ftell()和ungetc()的以下行关于ftell这个链接( SOURCE ) “对于文本流,数值可能没有意义但仍然可以用于稍后使用fseek将位置恢复到相同位置( 如果使用ungetc放回的字符仍然等待被读取,则行为未定义 )。” 关注上段的最后一行, pending of being read与“ungetc() – 获得的”字符被丢弃有关吗? 每次我们读取使用ungetc()放入流中的ungetc() ,它是否在读取后被丢弃 ?

我应该使用fseek SEEK_END

我的问题很简单: 我应该使用带有SEEK_END的fseek来获取文件的末尾然后获取它的长度吗? 因为在男人身上说: 允许库实现无意义地支持SEEK_END(因此,使用它的代码没有真正的标准可移植性)。 现在我使用stat(来自C)哪个更好?

覆盖到c中的特定行

我有一个大约2000行文本的文件,我在我的程序中生成,每行都有一个员工的信息,它像这样输出 1 1 Isaac Fonseca 58 c 1600 1310.40 6 1 0.22 2164.80 1 2 1 Manuel Gutierrez 22 d 1700 1523.37 4 1 0.13 897.26 1 3 1 Daniel Bernal 34 c 1600 1195.84 2 1 0.26 836.16 1 4 1 Miguel Gonzalez 43 e 1800 1195.84 0 1 0.15 0.00 1 但我每当我编辑员工信息时我都要更新文件,我正在做的是我搜索该行并尝试重写它 我已经看到了有同样问题的人的以下问题,但是当我尝试写入文件时,它总是写入文件的末尾 […]

读取每个30字节大二进制文件的最快方法?

读取大型二进制文件(2-3 GB)的每30个字节的最快方法是什么? 我已经读过由于I / O缓冲区而导致fseek出现性能问题,但我不想在抓取每30个字节之前将2-3 GB的数据读入内存。

使用带文件的fseek(文件,0,SEEK_END)了解二进制流的未定义行为

C规范有一个有趣的脚注(#268C11dr§7.21.39) “将文件位置指示器设置为文件结尾,与fseek(file, 0, SEEK_END) ,具有二进制流的未定义行为(因为可能是尾随空字符)或具有状态相关编码的任何流不能确定在最初的轮class状态结束。“ 这是否适用于读取文件的二进制流? (从物理设备) IMO,磁盘上的二进制文件只是一个字节的海洋。 在我看来,二进制文件不能具有状态相关的编码,因为它是一个二进制文件。 我对“二进制广泛流”的概念很模糊,如果它甚至可以应用于磁盘I / O. 我看到在串口流上调用fseek(file, 0, SEEK_END)就像一个com端口或stdin可能无法达到真正的结束,因为还没有确定结束 。 从而将问题缩小到物理文件。 [编辑]答案:与老年人(可能直到20世纪80年代后期)的关注。 目前在2014年,Windows,POSIT特定和非异国他人:不是问题。 @Shafik Yaghmour提供了一个很好的参考, 使用fseek和ftell来确定文件的大小是否有漏洞? 。 @Jerry Coffin将CP / M视为二进制文件并不总是具有精确的长度。 (每个wiki 128字节的记录)。 感谢@Keith Thompson的回答。 这一点解释了规范的“(因为可能有尾随空字符)”评论。

ftello / fseeko vs fgetpos / fsetpos

ftello / fseeko和fgetpos / fsetpos有什么区别? 两者似乎都是文件指针获取/设置function,使用不透明偏移类型有时允许64位偏移。 它们是在不同平台上支持还是由不同标准支持? 它使用的偏移类型是否更灵活? 顺便说一句,我知道fgetpos / fsetpos和ftell / fseek ,但这不是重复的。 那个问题询问ftell / fseek,答案不适用于ftello / fseeko。

如果在“a + b”模式下打开文件指针,fseek()会将文件指针移动到文件的开头吗?

我希望使用“a + b”模式打开一个文件,即如果它不存在则会自动创建,但如果是,我不想覆盖它。 我希望能够读取和写入该文件。 该文件是二进制文件,我想在其中保存特定struct记录。 所以我想对我想要的记录执行fseek() ,然后使用fwrite()保存记录。 代码如下所示( MyRecord是struct的typedef ,而FILENAME是文件名的#define ): int saveRecord(MyRecord *pRecord, int pos) { FILE* file = fopen(FILENAME, “a+b”); if (file == NULL) { printf(“Unable to open file %s\n”, FILENAME); return 0; } fseek(file, pos * sizeof(MyRecord), SEEK_SET); fwrite(pRecord, sizeof(MyRecord), 1, file); fclose(file); return 1; } 但是这个代码只是将记录追加到文件的末尾,即使我将pos设置为0.为什么SEEK_SET模式下SEEK_SET不能使用fseek() ? 我知道我可以简单地用“r + b”打开它,如果它失败了用“wb”打开它,但我想知道为什么这不起作用以及为什么用SEEK_SET fseek()将文件指针留在最后。 […]