функция чтения: копирование буфера в другой массив символов - PullRequest
2 голосов
/ 07 ноября 2011

Я новичок в 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;

Компилируется нормально, но выдает ошибку сегментации, когда я пытаюсь его запустить.

Есть идеи?Большое спасибо.

Ответы [ 5 ]

1 голос
/ 07 ноября 2011

вам нужно иметь достаточно места для хранения 10 символов, которые вы читаете

, которые вы объявили

char tempChar

, которые могут содержать 1 символ.

Вместо этого объявите tempChar как

char tempChar[10];
1 голос
/ 07 ноября 2011
char tempChar;

Выделяет только 1 байт.Таким образом, вы можете держать только 1 символ.При memcpy() вы запрашиваете копирование 10 байтов, которых не существует.Следовательно, вы читаете память, которую вы не должны вызывать Undefined Behavior (которая дает вам SegFault).

Вы должны сделать то же самое, что вы сделали с malloc() для str, или объявить локальный массив, например char chatTemp[10].Примечание: malloc() не требует приведения в C.

1 голос
/ 07 ноября 2011
char tempChar;
read(0, &tempChar, 10);

Вы читаете из памяти 10 символов из файла только размером одного символа.
char tempChar резервирует память только для одного символа, а & tempChar указывает на этот единственный байт памяти.

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

// why not now do ?
read(0, str, 10);
0 голосов
/ 07 ноября 2011

Если вы хотите прочитать два раза и поместить результаты рядом друг с другом в одном и том же буфере, вам не нужен временный буфер для этого: вы можете использовать арифметику указателя, чтобы указать 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();
}
0 голосов
/ 07 ноября 2011

Вам нужно дать дескриптор файла в качестве первого параметра для чтения функции. Также вам нужно выделить char * buffer вместо char tempChar; Проверить использование образца

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...