如何在c中获取文件长度?
Posted
技术标签:
【中文标题】如何在c中获取文件长度?【英文标题】:How to get a file length in c? 【发布时间】:2009-11-03 19:40:27 【问题描述】:我只是有一个关于如何获取包含十六进制数字的文件长度的快速问题。 例如:
724627916C
我能想到的唯一方法是将十六进制值转换为二进制:
724627916C => 0111001001000110001001111001000101101100
然后计算二进制值的位数。 只是想知道这是否是正确的方法?谢谢
【问题讨论】:
复制:***.com/questions/238603/… 也许您想知道文件的奇偶性,而不是长度? @jheddings:问题标题重复 - 但问题与标题不匹配。 @unknown:你在问什么;一点都不清楚。 谢谢,我现在才意识到,实际上,我必须处理两种类型的文件类型 1:文件包含十六进制值。类型 2:文件包含一系列字符。对于 Type 1 文件,我需要将 Hex 值转换为字符,然后计算转换后的字符序列的长度,而不是简单地获取文件的长度。而且我不需要更改类型 2 文件的任何内容。由于这两种文件类型的混淆,我不断得到意想不到的结果。不管怎样,问题已经解决了。谢谢。 How do you determine the size of a file in C?的可能重复 【参考方案1】:不, 这不是正确的方法。
FILE *fp = fopen("filename", "rb");
fseek(fp, 0, SEEK_END);
int lengthOfFile = ftell(fp);
fclose(fp);
原则上:打开一个文件,寻找到最后并检索您当前的位置。你会得到文件中的字节数。
编辑:您的问题有点不清楚。您要检索文件中的字节数,还是文件中十六进制字符串表示的字节数?如果是后者,并且您的文件中没有任何空格,只需将上述方法返回的字节数除以 2。
【讨论】:
谢谢,实际上,我需要检索文件中的字节数(或位数),包括空格。 1)fseek()
spec.: --> “二进制流不需要有意义地支持 wherece 值为 SEEK_END 的 fseek 调用。” 2)ftell()
返回一个long
。【参考方案2】:
在类似 un*x 的操作系统中,stat
可用于此目的。
【讨论】:
【参考方案3】:请尝试this answer 寻求帮助。如果这不起作用,Google 有大量关于确定 C 文件大小的信息。
【讨论】:
【参考方案4】:如果您想计算位数,设置一个数组会更简单,该数组告诉您在每个十六进制数字中设置了多少位(由字符代码索引),然后将它们相加而不显式转换为二进制。
假设 C99:
static bits_map[256] =
['0'] = 0, ['1'] = 1, ['2'] = 1, ['3'] = 2,
['4'] = 1, ['5'] = 2, ['6'] = 2, ['7'] = 3,
['8'] = 1, ['9'] = 2,
['a'] = 2, ['b'] = 3, ['c'] = 2, ['d'] = 3,
['e'] = 3, ['f'] = 4,
['A'] = 2, ['B'] = 3, ['C'] = 2, ['D'] = 3,
['E'] = 3, ['F'] = 4,
;
size_t n_bits = 0;
int c;
while ((c = getchar()) != EOF)
n_bits += bits_map[c];
printf("Number of bits set: %zd\n", n_bits);
【讨论】:
【参考方案5】:C中的文件长度使用函数_filelength()
#include <io.h>
int fn, fileSize;
FILE * f = fopen(&String, "rb");
if (f)
fn = _fileno(f);
fileSize = _filelength(fn);
fclose(f);
【讨论】:
以上是关于如何在c中获取文件长度?的主要内容,如果未能解决你的问题,请参考以下文章
如何获取音频文件的长度而不在 Flutter/Dart 中播放