文件中的字符数?

时间:2014-01-10 12:34:53

标签: c file fgetc

我想知道是否有一种从文件中读取字符并将其保存到没有指定数组长度的数组中的方法。

在正常情况下,我会读取所有字符并计算它们。 (步骤1)然后我用malloc创建数组并从文件中读取字符,所以我被迫读取整个文件两次。可以只用一次读数来完成吗?

3 个答案:

答案 0 :(得分:2)

执行此操作的常规方法是对文件结尾执行fseek,然后实际上没有两次读取所有字符。

fseek( fp, 0L, SEEK_END );
size_t size = ftell(fp);
fseek( fp, 0L, SEEK_SET );
char* buffer = malloc( size );
fread( buffer, 1, size, fp );

答案 1 :(得分:1)

您可以通过查找文件大小找到文件中的字符数。

int size = 0;
char* aFileContents = NULL;

fseek(fp, 0L, SEEK_END);
size = ftell(fp);
fseek(fp, 0L, SEEK_SET);  // reset the file pointer

aFileContents = (char*)malloc(size);

//  use the data

free(aFileContents);

答案 2 :(得分:0)

上述解决方案非常正确。但我想补充一点,我们应该打开文件“rb”,这是二进制模式,使它们工作。如果用简单的“r”/“a”打开文件,则文件将以文本模式打开。 fseek和ftell方法给出了整个文件的字节长度。 如果您正在使用二进制数据(不要使用fscanf / fprintf),即使用fread和fwrite,那么它最适合您。如果您使用fscanf / fprintf / fgets,我不确定这是否有效 例如

#include<stdio.h>
int main() {
  FILE *fid;
  char *data;
  long int size;
  fid = fopen("filename", "rb");
  fseek(fid, 0l, SEEK_END);
  size = ftell(fid);
  data = (char *) malloc(size);
  fseek(fid, 0l, 0);

  data = fread(data, 1, size, fid);
  // Use the data !!
}