有一个全局数组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()
之前将其分配给缓冲区。
答案 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
之类的名称作为函数中的局部变量;在任何合理的情况下,我都不会将它用作全局变量。)