2011-11-06 39 views
2

我是C新手,想要使用读取功能。我想获取缓冲区(tempChar)中的内容并将其放入另一个字符数组(str)中。这样我就可以再次运行读取函数并在以后添加到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; 

它编译罚款,但它给了我一个分段错误,当我其实尝试运行它。

任何想法?谢谢一堆。

回答

1

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

你宣布

char tempChar 

可容纳1个字符。

相反声明tempChar作为

char tempChar[10]; 
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
char tempChar; 

只分配1个字节。所以你只能容纳1个字符。当你memcpy()你请求复制10个不存在的字节。因此,你读内存,你不应该导致未定义的行为(这给你SegFault)。

您应该像使用malloc()一样对str进行操作,或者声明char chatTemp[10]这样的本地数组。注:malloc()不C.

需要强制
0

你需要给一个文件描述符读取功能的第一个参数。还需要如果你想分配char * buffer代替char tempChar; Check sample usage

+0

零是一个文件描述符:按照惯例,它是文件描述符底层'stdin'。 – zwol

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(); 
} 
相关问题