读取功能:将缓冲区复制到另一个char数组

时间:2011-11-06 21:38:37

标签: c arrays char

我是C的新手,我正在尝试使用read函数。我想取缓冲区中的内容(tempChar)并将其放在另一个char数组(str)中。这样我就可以再次运行read函数并稍后添加到str(因为tempChar将被第二个读取函数重写)。像这样:

char tempChar;
read(0, &tempChar, 10);

char *str;
str= (char*) malloc(10);
memcpy(str, &tempChar, fileSize); /*I'm doing something wrong here*/

这一切让我可以重新运行:

read(0,&tempChar, 1);
str= realloc(str, 11);
str[10]=tempChar;

它编译得很好,但是当我真正尝试运行它时,它会给我一个分段错误。

有什么想法吗?非常感谢。

5 个答案:

答案 0 :(得分:1)

char tempChar;
read(0, &tempChar, 10);

您正在从文件中读取10个字符,只能读取单个字符大小的内存 char tempChar仅为单个字符保留内存,& tempChar指向此单个字节的内存。

char *str;
str= (char*) malloc(10);

// why not now do ?
read(0, str, 10);

答案 1 :(得分:1)

您需要有足够的存储空间来存储您正在阅读的10个字符

你宣布了

char tempChar

可以容纳1个字符。

而是将tempChar声明为

char tempChar[10];

答案 2 :(得分:1)

char tempChar;

仅分配1个字节。所以你只能拿到1个字符。当您memcpy()请求复制10个不存在的字节时。因此,您读取内存不应导致未定义的行为(它为您提供SegFault)。

您应该执行类似于使用malloc()执行str的操作或声明像char chatTemp[10]这样的本地数组。注意:malloc()不需要在C中进行强制转换。

答案 3 :(得分:0)

您需要提供一个文件描述符作为读取函数的第一个参数。此外,您需要分配char * buffer而不是char tempChar; Check sample usage

答案 4 :(得分:0)

如果要读取两次并将结果放在同一个缓冲区中,则不需要临时缓冲区:可以使用指针算法告诉read使用后半部分原始缓冲区。像这样:

char buf[10];
ssize_t nread = read(0, buf, 5);
if (nread < 0)
    error();
else
{
    nread = read(0, buf + nread, sizeof buf - nread);
    if (nread < 0)
        error();
}