根据文件大小 - C,动态地将大小分配给数组

时间:2014-01-23 03:50:38

标签: c arrays dynamic-memory-allocation

有一个全局数组b[],需要在main()和其他一些函数中使用。现在需要根据输入文件大小来确定此数组的大小。结构将类似于:

#include <stdio.h>
#include <conio.h>

char b[];

main() {

    FILE *f;

    f=fopen("Text.txt", "rb);

    if(file_size = 200)
       b[20];
    else if(file_size>200)       // I want to do something like this
       b[50];


    //Accessing b[] in the main

}

display() {

    //Accessing b[] in display

}

如何通过计算文件大小来实现。由于数组b[]正在main()以及display()中使用,因此必须是全局的。但是,我不知道如何计算文件的大小并在main()之前将其分配给缓冲区。

2 个答案:

答案 0 :(得分:2)

这里有一些改编自opengl编程的代码wikibook:

#include<stdlib.h>
#include <stdio.h>
#include <conio.h>

long file_size(File* file)
{
  if(input == NULL) return -1;

  long pos = ftell(input);

  if(fseek(input, 0, SEEK_END) == -1) return -1;
  long size = ftell(input);
  if(size == -1) return -1;
  if(fseek(input, pos, SEEK_SET) == -1) return -1;

  return size;
}

int display(char* b) 
{
  //Accessing b[] in display
}

int main() 
{

  FILE *f;

  f=fopen("Text.txt", "rb");

  long size = file_size(f); //returns -1 on error

  if(size == 200)
     b = malloc(20 * sizeof(char)); //replace char if you change b's type
     b = malloc(50 * sizeof(char));

  //b[0] = something, etc //access b[] 
  //display(b); //pass b to display function

  free(b);  
}

答案 1 :(得分:1)

简洁地说,你无法做你想做的事情,即在程序开始执行后改变全局数组的大小。

因此,您需要使用动态内存分配。将声明更改为:

static char *b = 0;

static表示只能通过此文件中的函数访问它,但由于您没有显示任何其他文件,因此无关紧要。如果您确实需要访问其他文件中的变量,则需要一个标头来声明变量,然后您将删除关键字static

使用char *b代替char b[]表示您可以使用malloc()或其中一位朋友(使用#include <stdlib.h>来声明它们)分配所需的空间,然后在完成后使用free()释放内存。您还需要告诉软件的其他部分分配了多少内存,因此还会有另一个变量,例如:

static size_t b_size = 0;

您将在分配时将其设置为大小。分配内存后,可以使用b,就好像它是一个数组一样。

不要忘记检查分配是否成功。

关于查找文件大小,您可以在基于POSIX的系统(Unix等)上使用特定于平台的功能,例如stat(),也可以使用 fseek()ftell()。这些是相当便携的,但仅限于处理足够小的文件,以便可以用long表示大小。在64位系统上,这不是问题;对于32位系统,如果您可能需要处理多千兆字节的文件(但当然,分配多千兆字节的内存也充满了32位系统)可能会出现问题。

最后,目前,名称b对于全局变量来说不是一个非常好的名称。使用更有意义的名称通常是个好主意,特别是对于全局变量。 (我使用b之类的名称作为函数中的局部变量;在任何合理的情况下,我都不会将它用作全局变量。)