Нужна функция вроде read (), которая считывает целочисленные данные в буфер и получает то же значение буфера, что и read () - PullRequest
0 голосов
/ 06 ноября 2019

Как я могу преобразовать целое число в значение / закодированный символ так же, как буфер, полученный с помощью read (0, buff, nbytes), когда я получаю одно и то же целое число? Я пытаюсь написать что-то похожее на read (), но с целочисленными данными вместо аргумента дескриптора файла, который читается в буфер.

like_read(int data,void *buff,size_t nbytes);

Он должен быть похож на read () в том смысле, что он должен считывать в буфер то же значение, что и read (0, buff, nbytes) из stdin в его буфер. когда я предоставляю целочисленный адрес непосредственно в виде буфера, без предварительного использования read (0, buff, nbytes), например,

int Integer=25
int nbytes=2;
int rlen,wlen,wlen1;
int fd = open("ttyusb.txt", O_RDWR | O_CREAT,0777);
wlen = write(fd, &Integer, nbytes);
wlen1 = write(1, &Integer, nbytes);//for stdout
close(fd);

Ожидаемый вывод

25

Фактическим содержимым вывода / файла является некоторый закодированный символ

, он не дает мне желаемого результата, так как сначала использует read () для чтения целого числа в буфер из stdinи затем запись этого буфера в файл с помощью write (), например:

int Integer;
int nbytes=2;
int rlen,wlen;
int fd = open("ttyusb.txt", O_RDWR | O_CREAT,0777);
rlen = read(0, &Integer, nbytes);
wlen = write(fd, &Integer, nbytes);
wlen1 = write(1, &Integer, nbytes);//for stdout
close(fd);

Stdin

25

Ожидаемый вывод

25

Фактический вывод / содержимое файла

25

когда я печатаю значение буфера после чтения (0, буфер, nбайт), он дает некоторое закодированное значение:

int Integer, nbytes=2;
int fd = open("ttyusb.txt", O_RDWR | O_CREAT,0777);
rlen = read(0, &Integer, nbytes);
wlen = write(fd, &Integer, nbytes);
wlen1 = write(1, &Integer, nbytes);
printf("\nInteger buffer value %d\n",Integer);
close(fd);

stdin 0 выводит "Integer buffer value 2608", stdin 1выдает «Целочисленное значение буфера 2609», stdin 2 печатает «Целочисленное значение буфера 2610», ..... stdin 9 печатает «Целочисленное значение буфера 2617» ...

какая кодировка считывается ()используя дляконвертировать целочисленные значения и как я могу сделать это преобразование без чтения ()?

1 Ответ

1 голос
/ 06 ноября 2019

Я не совсем уверен, чего вы пытаетесь достичь, но моя интерпретация заключается в том, что вы пытаетесь скопировать байты int в буфер. Это может быть реализовано примерно так:

#include <string.h>

void like_read(int data, void *buff, size_t nbytes)
{
    size_t n;

    /* Limit number of bytes to copy from data variable. */
    n = sizeof(data);
    if (n < nbytes)
        n = nbytes;
    /* Copy bytes from data variable to the buffer. */
    memcpy(buff, &data, n);
    /* If destination buffer is larger than data variable, ... */
    if (n < nbytes) {
        /* ... set the remaining bytes in the destination to all zero. */
        memset((char *)buff + n, 0, nbytes - n);
    }
}

какая кодировка используется read () для преобразования целочисленных значений и как я могу выполнить это преобразование без read ()?

read() просто считывает необработанные байты данных из файлового дескриптора без какого-либо преобразования, по крайней мере в системах типа POSIX, таких как Unix и Linux. Некоторые другие операционные системы, такие как Microsoft Windows, позволяют открывать файлы со специальными флагами, которые выполняют некоторое преобразование в байтах необработанных данных, в основном для обработки текстовых файлов с различными кодировками.

Вызов memcpy() в like_read Функция выше копирует необработанные байты данных из одной ячейки памяти в другую без преобразования.


РЕДАКТИРОВАТЬ

Я все еще не уверен, что вы (OP)пытаясь достичь, но, основываясь на ваших комментариях ниже, возможно, вы ищете функцию, которая «печатает» целочисленное значение в виде десятичных символов ASCII в буфер с новой строкой, но усекает до указанного числа байтов. Это почти можно сделать с помощью snprintf(), но эта функция всегда записывает завершающий нулевой байт в буфер (если размер буфера равен по крайней мере 1), поэтому я думаю, что это не совсем то, что вам нужно. Следовательно, snprintf() может использоваться для вывода целочисленного значения в промежуточный буфер достаточного размера, а затем memcpy результат в указанный буфер. Вот реализация этого:

#include <string.h>
#include <stdio.h>

void like_read(int data, void *buff, size_t nbytes)
{
    char tempbuf[24]; /* ought to be large enough... */
    size_t n;

    /* Print data value to temporary buffer. */
    n = snprintf(tempbuf, sizeof(tempbuf), "%d\n", data);
    /* n is number of bytes that would be printed to tempbuf if room. */
    /* Limit number of bytes to copy to size of temporary buffer. */
    if (n > sizeof(tempbuf))
        n = sizeof(tempbuf);
    /* Limit number of bytes to copy to nbytes. */
    if (n > nbytes)
        n = nbytes;
    /* Copy bytes from tempbuf to the buffer. */
    memcpy(buff, tempbuf, n);
    /* If destination buffer is larger than n, ... */
    if (n < nbytes) {
        /* ... set the remaining bytes in the destination to all zero. */
        memset((char *)buff + n, 0, nbytes - n);
    }
}
...