C 如何找出分配一个字符数组的空间

C 如何找出分配一个字符数组的空间,c,arrays,C,Arrays,我正在编写一个程序,它接收用户给定的文件并继续读取它。但是,我也希望使用尽可能少的内存,因此不希望为数组分配100000个字符,除非完全必要。这是我目前必须读取的文件代码 char*读取输入(const char*文件) { int-fd; int read_stat; int i; 字符tmp[1000000]; 字符缓冲区[1]; i=0; 如果((fd=open(file,O_RDONLY))=-1) printf(“错误”); 而((read_stat=read(fd,buffer,1)

我正在编写一个程序,它接收用户给定的文件并继续读取它。但是,我也希望使用尽可能少的内存,因此不希望为数组分配100000个字符,除非完全必要。这是我目前必须读取的文件代码

char*读取输入(const char*文件)
{
int-fd;
int read_stat;
int i;
字符tmp[1000000];
字符缓冲区[1];
i=0;
如果((fd=open(file,O_RDONLY))=-1)
printf(“错误”);
而((read_stat=read(fd,buffer,1)))
{
tmp[i++]=缓冲区[0];
如果(i>1000000)
printf(“错误”);
}
tmp[i]='\0';
如果(关闭(fd)=-1)
printf(“错误”);
返回(ft_strdup(tmp));
}

有什么建议吗?

您可以使用stat()确定文件的大小,并基于此动态地为tmp分配内存。差不多-

    struct stat st;
    off_t filesize;

    if (stat(filename, &st) == 0)
       filesize = st.st_size;

一旦获得文件大小,就给tmp分配这么多内存。

您可以使用stat()确定文件大小,并根据该大小动态地为tmp分配内存。差不多-

    struct stat st;
    off_t filesize;

    if (stat(filename, &st) == 0)
       filesize = st.st_size;
一旦获得文件大小,请将这么多内存分配给tmp。

尝试以下方法:

#include <sys/stat.h>
struct stat st;
stat(filename, &st);
int size = st.st_size;
printf("size = %d\n", size);
#包括
结构统计;
stat(文件名,&st);
int size=st.st\u size;
printf(“大小=%d\n”,大小);
它应该提供在
size
中读取的克拉数

尼古拉斯试试这个:

#include <sys/stat.h>
struct stat st;
stat(filename, &st);
int size = st.st_size;
printf("size = %d\n", size);
#包括
结构统计;
stat(文件名,&st);
int size=st.st\u size;
printf(“大小=%d\n”,大小);
它应该提供在
size
中读取的克拉数


尼古拉斯

你可以用malloc,类似这样的东西

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>

char *read_input(const char *file) {
   int  fd;

   char *buffer;

   if ((fd = open(file, O_RDONLY)) == -1)
      printf("Error");

   int size = lseek(fd, 0, SEEK_END);
   lseek(fd, 0, SEEK_SET);
   buffer = (char*)malloc(size+1);
   read(fd, buffer, size);
   close(fd);

   return buffer;
}


int main() {

 char *r = read_input("test.txt");
 //printf("%s\n",r);
 free(r);

 return 0;
#包括
#包括
#包括
#包括
字符*读取输入(常量字符*文件){
int-fd;
字符*缓冲区;
如果((fd=open(file,O_RDONLY))=-1)
printf(“错误”);
int size=lseek(fd,0,SEEK_END);
lseek(fd,0,SEEK_集);
缓冲区=(字符*)malloc(大小+1);
读取(fd、缓冲区、大小);
关闭(fd);
返回缓冲区;
}
int main(){
char*r=read_输入(“test.txt”);
//printf(“%s\n”,r);
自由(r);
返回0;

}您可以使用malloc,类似这样的

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>

char *read_input(const char *file) {
   int  fd;

   char *buffer;

   if ((fd = open(file, O_RDONLY)) == -1)
      printf("Error");

   int size = lseek(fd, 0, SEEK_END);
   lseek(fd, 0, SEEK_SET);
   buffer = (char*)malloc(size+1);
   read(fd, buffer, size);
   close(fd);

   return buffer;
}


int main() {

 char *r = read_input("test.txt");
 //printf("%s\n",r);
 free(r);

 return 0;
#包括
#包括
#包括
#包括
字符*读取输入(常量字符*文件){
int-fd;
字符*缓冲区;
如果((fd=open(file,O_RDONLY))=-1)
printf(“错误”);
int size=lseek(fd,0,SEEK_END);
lseek(fd,0,SEEK_集);
缓冲区=(字符*)malloc(大小+1);
读取(fd、缓冲区、大小);
关闭(fd);
返回缓冲区;
}
int main(){
char*r=read_输入(“test.txt”);
//printf(“%s\n”,r);
自由(r);
返回0;

}

有两种方法可以做到这一点。传统的方法是动态分配一个指向每一行的指针和每一行的内存。这个方案很简单。在
read\u input
中分配一些初始数量的指针,连续读取每一行,为每一行分配存储,并将内存块的地址分配给下一个可用指针,跟踪使用的指针数量,根据需要重新分配指针数量,并在函数末尾最后一次调用
realloc
,以调整分配给所需数量的指针数量

当您消化该方案时,它基本上不会分配超过保存该文件绝对必要的内存(+每行一个指针)。对于读取包含未知长度行的未知大小的文件,它的内存效率几乎与您所能获得的内存效率相同

话虽如此,对
read\u输入进行一些调整。通常,在调用函数(
main()
此处)中打开文件,并将文件流指针(或文件描述符)作为参数传递给
read\u input
。您还应该将指向
size\u t
的指针作为第二个参数传递给
read\u input
,并使用
read\u input
中读取的行数更新指针,以便调用者可以返回该值

(您还可以在末尾分配一个额外的指针,作为哨兵
NULL
,允许您确定读取的行数,而无需将指针传递到
size\u t

您将从
read\u input
返回指向char的指针(例如
char**
,而不是
char*
),从而使调用函数可以使用所有行

为了处理文件操作,您可以自由地使用文件描述符和低级的
读取
/
写入
函数,但是C具有文件流函数,可以使读取/处理文本文件的工作更轻松。(例如,使用
fgets
或POSIX
getline
读取,如下所示)

把所有这些放在一起,您可以执行如下操作,读取作为第一个参数给出的文件(如果没有提供参数,则默认情况下从
stdin
)。它将读取任何大小的文件以及任何长度的行,直到到达文件末尾(除非在到达文件末尾之前内存耗尽)

示例使用/输出

$ ./bin/getline_read_input <../dat/captnjack.txt
line[  0] : This is a tale
line[  1] : Of Captain Jack Sparrow
line[  2] : A Pirate So Brave
line[  3] : On the Seven Seas.
始终确认已释放所有已分配的内存,并且没有内存错误


仔细检查一下,如果您还有其他问题,请告诉我。

有几种方法可以解决这个问题。传统的方法是动态分配一个指向每一行的指针和每一行的内存。这个方案很简单。在
read\u input
中分配一些初始数量的指针,连续读取每一行,为每一行分配存储,并将内存块的地址分配给下一个可用指针,跟踪使用的指针数量,根据需要重新分配指针数量,并在函数结束时最后一次调用
realloc
,以调整