C 如何找出分配一个字符数组的空间
我正在编写一个程序,它接收用户给定的文件并继续读取它。但是,我也希望使用尽可能少的内存,因此不希望为数组分配100000个字符,除非完全必要。这是我目前必须读取的文件代码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)
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
或POSIXgetline
读取,如下所示)
把所有这些放在一起,您可以执行如下操作,读取作为第一个参数给出的文件(如果没有提供参数,则默认情况下从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
,以调整