2014-01-23 80 views
0

有一个全局数组b[],需要在main()和其他一些函数中使用。现在这个数组的大小需要根据输入文件的大小来决定。该结构会是这样的:根据文件大小动态分配大小为阵列 - C

#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()之前将它分配给缓冲区。

+0

为什么使用全局数组?只是使用malloc(),这是“动态内存分配”。 – moeCake

+1

你不能同时拥有固定数组和动态数组。 –

+2

隐式'int'在上个千年被取缔,请写现代C. –

回答

2

下面是一些代码改编自一个OpenGL编程维基:

#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); 
} 
+0

这是你的意思: 字符* b = 0; (){ FILE * f; F =的fopen( “TEXT.TXT”, “RB); \t \t B = FILE_READ(” G:\\ workspaceC \\ small4.txt“); //访问B []在主 } 它给了一个错误“冲突的类型‘FILE_READ’” – user3213918

+0

@ user3213918它现在的工作?有可能宥没有#包括 user3125280

+0

仍然没有工作。我已经复制粘贴你上面给的代码,后main()。我也尝试添加stdlib.h 错误“冲突的类型为'file_read' – user3213918

1

简洁地说,你不能做你正在寻求做什么,该计划开始执行后,即改变一个全局数组的大小。

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

static char *b = 0; 

static意味着它只能通过此文件中的函数访问,但因为你不显示任何其他文件,这并不重要。如果您确实需要访问其他文件中的变量,则需要一个标题来声明该变量,然后您将删除关键字static

代替char b[]采用char *b意味着你可以(使用#include <stdlib.h>声明它们)分配你需要malloc()或它的一个朋友的空间,然后用free()释放内存时,即可大功告成。您还需要告诉该软件的其他部分的内存是如何分配的,所以就会有另一个变量,例如:

static size_t b_size = 0; 

,当你分配它,你将设置为大小。分配内存后,可以使用b,就像它是一个数组一样。

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

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

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