【发布时间】:2013-11-22 21:35:55
【问题描述】:
我需要你解决一个小问题。 我尝试读取一个文件并根据我的宏的值显示他的内容(如函数“cat”)。 使用我的 BUFF_SIZE 4096 我可以轻松地显示字符串,但是当我输入 BUFF_SIZE 1 时,我的程序会显示所有行的第一个字符。 我不确定我的代码是否 100%,因为我在我的个人电脑上,但如果你真的需要它,我明天可以给你。 对于我的问题,我认为我必须做一些类似函数 strdup 的事情,但我真的不知道如何将它包含在我的代码中
#define BUFF_SIZE 4096
char *my_function(const int a)
{
static int i;
static char **str;
static int ret;
static char *buff[BUFF_SIZE];
static int j;
i = 0;
j = 0;
str = malloc(BUFF_SIZE * sizeof(char));
while ((ret =read(a, buff, BUFF_SIZE)) > 0)
{
while (buff[i] != '\0')
{
str[j] = buff[i];
i++;
j++;
}
return (str);
}
free(str);
}
对不起,我的英文大概是
【问题讨论】:
-
(a, buff, BUFF_SIZE) 会返回一个int?怎么样?
-
str = malloc(BUFF_SIZE * sizeof(char));没有分配足够的内存;使用str = malloc(BUFF_SIZE * sizeof str[0]); -
我忘了更改读取,我已经编辑了我的消息,它是 ret = read(a,buff,BUFF_SIZE)
-
And.... ufff... 这段代码有一些非常错误的地方:为什么在内部循环中返回?有了它,您只会读取一次文件。然后,退出函数。
-
read()系统调用不会终止输入数据。您的循环需要循环读取已读取的字符数。但是您也需要丢失所有这些静态变量,并弄清楚该函数的真正目的是什么(因为它肯定没有达到预期的效果——它充其量是可怕的泄漏)。如果您想将整个文件 slurp 到内存中(“slurp”是读取整个文件的技术术语)。您通常会找到文件的大小(例如lseek()),分配内存并读取。或者您以 64 KiB 的块为单位增量分配内存。等等。