问题标签 [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 投票
1 回答
350 浏览

c++ - CStdioFile 不能处理大于 2GB 的文件?

我正在使用 Visual C++ 2008。在 VC++ 2008 中,CFile支持 2^64 个大文件。所以我觉得CStdioFile也应该支持。

但是,在CStdioFile::GetLength()大于 2GB 的文件上使用时,我得到一个CFileException,下面是代码片段:

跟踪到 后CStdio::GetLength(),我发现以下代码段会引发异常,如下所示:

令人惊奇的是CStdioFile仍然使用ftell而不是_ftelli64来处理流。

然后我搜索文档CStdioFile,我找不到任何文档CStdioFile::GetLength,唯一相关的是https://docs.microsoft.com/en-us/cpp/mfc/reference/cstdiofile-class?view=vs-2019#seek,它要求我查看fseek文件。但是在fseek文档中,我仍然没有找到任何与文件大小限制相关的内容。

最后我找到一个第三方网站,指出CStdioFile::GetLength包含错误:http://www.flounder.com/msdn_documentation_errors_and_omissions.htm#CStdioFile::GetLength,但它没有提供解决方案。

除此之外,几乎没有任何关于CStdioFile在线 2GB 限制的问题或帖子。这真的很奇怪。

我尝试检查CStdioFileiN VC++ 2017 的源代码,它与 2008 的源代码相同。

CStdioFile那么是否有不重写整个类的简单解决方案呢?

0 投票
2 回答
168 浏览

file-io - ftell/fseek 在接近文件末尾时失败

读取文本文件(恰好是 PDS 成员 FB 80)

并且已经到达文件中只剩下一个空行的位置。

然后读取最后一行,它只包含一个'\n'字符。

失败: -

指定的位置fseek()ftell()几行之前返回。在我看到的特定错误情况下,它的值为 841。通过调试器检查,这也是ftell前面几行返回的值。它没有被损坏。

相同的代码适用于文件中的其他位置,并且仅在记住该位置时剩下一个空行要读取的点处失败。

我对 SO的另一个答案简洁地理解了我对如何ftell/应该工作的理解。fseek

从文本流上的 ftell 返回的值与您目前已阅读的字符数没有可预测的关系。您唯一可以依赖的是,您可以随后将其用作 fseek 或 fseeko 的偏移参数以移回相同的文件位置。

似乎我不能依赖我应该能够依赖的一件事。

我的问题是,为什么fseek会以这种方式失败?

0 投票
1 回答
74 浏览

arrays - 无法将 ftell 函数的返回值分配给 char 数组大小

我正在尝试从分配内存最少的文件中打印一些值。我使用 ftell() 来查找文件,从而最大限度地减少使用的内存。我做了3种方法,其中一种是成功的。我不知道为什么另外 2 个不打印到字符串,因为它们似乎类似于成功的代码。

以下字符串位于我尝试输出的文件中

我的尝试:

成功的

失败:

输出:什么都没有打印出来

失败#2:

输出:一些垃圾

0 投票
2 回答
335 浏览

c - 使用C中的递归从txt文件反向打印

我需要使用递归在终端中向后写出 .txt 文件,但似乎我被卡住了。到目前为止,这是我的代码,但它创建了一个无限循环。此外,过程write()应该只有 1 个参数 - 指向文件的指针。

我想使用fseekftell函数,它们似乎是最好的方法。我的预期输出是: 文件 Hello world 输出 dlrow olleH

0 投票
0 回答
87 浏览

c - 在 fwrite() 函数的帮助下使用 in 循环在 .dat 文件中写入数据时,为什么在随机位置会在内存中创建空块?

121_5.c 的代码(121_5.c 是程序名)

输出

输出

以文本格式输出

现在看到在 .dat 文件中写入数据时,我正在检查文件指针指向的位置。所以文件指针最初指向位置0并且位置每次增加44,因为学生数据类型的大小是44

但数据从176-219(44字节)进入后第220位被空填充,则数据从第221位开始正常写入。所以我的问题是为什么突然空字符排在第 220 位。

现在我增加输入数据并运行循环更多次以检查我在哪里可以再次获得 null 所以我在 1101,1454,1983,2336,1689,3042 得到它......

当数据进一步增加时输出

当输入进一步增加时输出

以文本模式输出

0 投票
0 回答
29 浏览

c - 使用文件函数反转文件中的字符

因此,使用 fseek 和 ftell 函数,我尝试一次打印一个字符,方法是首先使用 fseek 指向文件的末尾,然后递减 ftell 的值以打印最后一个字符,然后打印前一个字符。

我的代码正在打印一些奇怪的字符,所以它不起作用,关于我在 while 循环中哪里出错的任何建议?

0 投票
1 回答
101 浏览

c - ftell 返回不准确的值

所以,我在 c 中有这段代码,它应该从一个 ascii 文件中读取,然后返回一个被解析并编译成字节码的字符串。当我尝试使用 ftell 获取文件的大小时,它返回 33 而不是 29(文件包含新行的字节数)。

文件:

编码:

似乎无缘无故地又添加了四个字节。我的解析器抱怨“hlt====”不是一个有效的指令(“====”是 4 个额外的字节)。

Ftell 或 fseek 在这种情况下搞砸了,我不知道这是否是错误

我在 Windows 上,我也在使用 Visual Studio