问题标签 [ftell]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
133 浏览

php - Ftell 在文件指针上应用流过滤器时报告意外值

我正在尝试ftell在应用zlib.deflate流过滤器时计算写入文件的数据。但是ftell基于大小与写入文件的数据的实际大小不同。

以下是我的代码

以下是结果

0 投票
1 回答
329 浏览

c - fseek ftell 读取相同的输入

我试图让我的程序为每个孩子一次读取一行(每行包含一个 int)。每次我执行此读取时,它都会继续读取第一行。

这是我的代码的基础。

0 投票
1 回答
118 浏览

c++ - 从文件c ++中获取偶数位置的数字

我编写了这个程序,假设将一些浮点数写入二进制文件,然后读取它并仅显示位于偶数位置的数字。现在,我很难弄清楚如何验证位置并显示其中的内容。任何人都可以看看代码并告诉我是否有任何错误,我怎么能这样显示?当 ftell、fgetpos 等在二进制文件中使用时,它们的行为方式究竟发生了什么变化,我也有点困惑。任何答案将不胜感激。这是代码:

0 投票
1 回答
2373 浏览

c++ - fgets() 似乎没有正确移动文件指针

我有一个应用程序从另一个应用程序同时写入的文本文件中读取。读取文件的应用程序使用 C - fopen 以文本模式打开它。文件中的行可能很大,例如最大 100 兆。出于这个原因,我们有一个函数,它使用 fgets 从文件中读取 4K 的块并将其附加到字符串对象中,直到它设法读取完整的行。进行读取尝试时,正在写入文件的应用程序可能已写入部分行。Out 自定义 ReadLine 函数通过检测文件结尾、将文件指针重新设置到最后一个已知的正确位置并丢弃已经读取的文本来处理这种情况。

该函数如下所示:

问题:我遇到了这样一种情况,在从文件中读取整行后,ReadLine() 函数在再次调用读取下一行时从先前读取的行返回最后一个块。我记录了 ftell() 返回的 lastOffset 的值,并注意到在这种罕见的情况下,fgets 没有将文件指针移动到它读取的行的末尾。

我添加了一些调试行,但在我的情况下,唯一打印的是 lastOffset 值。

在ReadLine返回不完整行的调用中,lastOffset的值为:21563617 不完整行的长度为:920

在返回完整行之前的调用中,lastOffset 的值为:21442207 上一次调用中读取的行长度为:122331(包括换行)

我的问题是:有没有人遇到过类似的问题?您对可能出现的问题有何看法?我不一定要寻找一个完整的答案,而只是一些关于可能出错的指示。

** 更新 **

我设法用一个小实用程序重现了这个问题,以 4K 的块写入一个文件,睡眠间隔为 10 毫秒,而另一个程序(使用上述功能)同时从同一个文件读取。

看起来在上面的函数中执行 fseek() 来重新设置文件指针是一个不好的选择,因为将文件指针重新设置到以前的位置并不一定会清除 C 库自己的内部缓冲区。我仍然不完全相信这种解释,因为在某些情况下(重现情况)文件指针重置从未发生过。

无论如何,我在网上做了一些搜索,一些线程似乎建议使用较低级别的流并处理库本身的缓冲。所以我改变了上面函数的实现和它的其他助手来做到这一点。我现在使用 Windows 的 _sopen_s()/_read()/_lseek() 和 Linux/Solaris 的标准 POSIX 接口来执行较低级别的 IO 处理。通过这些更改,它似乎起作用了,我不再看到这个问题了。

谢谢大家的时间。非常感谢您的所有意见。

苏曼

** 更新 2 **

好吧,现在我肯定知道原因了。问题是如果文件以文本模式打开,则 ftell() 和 fseek() 是不可靠的。如果文件以二进制模式打开,则上面的功能可以正常工作。

这是其他人之前发现此问题的文章的链接:http ://arstechnica.com/civis/viewtopic.php?f=20&t=420490

这是一件好事,因为现在我有一个需要更改 1 行而不是 200 行的修复程序!:-)

0 投票
1 回答
216 浏览

c - Strange value for offset in fwrite

For the purpose of tracing I/O calls, I have overwritten fwrite in a shared library that I LD_PRELOAD when running a program. In my version of fwrite, I get the absolute offset of the write using

The value is then passed to a function that takes a size_t argument (so unsigned long), and the value is printed.

I encountered some calls with 18446744073709551615 as the offset (2^64 - 1), so I guess the initial long int returned by ftell was -1. These operations always wrote 10 bytes.

So my question is: what could have led the stream offset to be set to -1?

I don't trace the name of the files being accessed by those strange fwrites, so I don't know what is being accessed. Also I should precise that the program is an MPI program. It might be possible that the stream involved is actually a socket, or something else than a file...

0 投票
0 回答
1712 浏览

php - 使用 PHP 流式传输 HTML5 大型 (>2GB) 视频

好的,所以基本上我正在处理一个需要从隐藏源流式传输 MP4 视频的项目。

与本论坛中的大多数人一样,我使用的解决方案源自:http : //mobiforge.com/developing/story/content-delivery-mobile-devices

当您尝试处理大于 2GB 的视频文件(在 x86 机器中)时,会出现此问题。

我发现的第一个问题是 phpfilesize()函数,当文件大于 2GB 时它会给出一个负值。对于这个问题,我正在使用一种可以正常工作的解决方法:

第二个是一些参数像整数一样被初始化,在某些时候,它们失败了......我通过使用浮点数来解决这个问题。

第三个是 phpftell()函数(它在循环中被调用),它也返回一个整数......所以我有与filesize()函数相同的问题。由于ftell()进入循环时返回的值与参数的值相同$start,因此我决定使用一个新参数(让我们称之为$mm$start),它将以与参数相同的值进入循环,然后我只需$buffer在每个循环中添加 的值,因此我不需要使用该ftell()函数。

它看起来像这样(澄清这$start是一个浮点数):

$$mm并且ftell()在所有循环期间具有相同的值,但由于某种原因,通过此更改,即使对于 <2GB 的文件也不起作用。我认为也许在某些时候它们可能有不同的值,所以我在下一个条件中放置了一个断点:

在:

它从未停止过......所以我有点迷茫,你知道在工作循环中可能有什么问题吗?您知道可以避免该ftell()功能的任何其他解决方法吗?

0 投票
1 回答
114 浏览

c - Ftell 停止返回?

好吧,在向后阅读我的文件并确保我不在顶部时,在调试器中我意识到 ftell 停止返回一个位置,任何人都可以解释一下吗?

0 投票
1 回答
312 浏览

fortran - GFortran:读取大于 2GB 的文件

GFortran 是否允许 8 字节整数作为读取和查询pos=参数的值?

GFortran 是否有用于获取超过 2GB 的文件位置的 8 字节版本的 ftell?

INTEL Fortran 编译器有一个名为 ftell 的 8 字节整数版本,ftelli8但我没有找到任何关于 Gfortran 的信息。

0 投票
2 回答
81 浏览

c - 在 I/O 流 -C 中查找重复出现的字符串?

我对 C 很陌生。我正在尝试编写一个在 I/O 流中查找字符串的代码,但我不明白我做错了什么。我知道错误可能在大的while循环中(在下面的代码中)。我希望函数从流的开头返回位置(以字节为单位),如果由于某种原因失败,则返回 -1。对于我尝试使用的任何文件,它只会不断返回 -1。

任何帮助是极大的赞赏

0 投票
3 回答
3597 浏览

c - malloc() 没有分配足够的空间

你好这是我的问题

我的代码只是打开一个文件并将其内容加载到内存中。问题是,当我使用

它只分配 4 个字节,而不是文件的全部大小(即打开一个带有小句子的简单 txt 时为 25 个字节)。当我打印bufferfSize最后的尺寸时,我分别得到 4 和 25,所以fSize是正确的。知道为什么会这样吗?

谢谢,