2014-01-23 78 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這樣的名稱作爲函數中的局部變量;在任何合理的情況下,我都不會將它用作全局變量)。