0

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

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

4

3 回答 3

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 );
于 2014-01-10T12:39:51.090 回答
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);
于 2014-01-10T12:39:41.820 回答
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 !!
}
于 2014-01-10T13:23:17.490 回答