Khi tôi nhập cùng một số nguyên, làm cách nào để chuyển đổi số nguyên thành cùng giá trị/ký tự được mã hóa làm bộ đệm tôi nhận được bằng cách sử dụng read(0,buff,nbytes)? Tôi đang cố viết một cái gì đó tương tự như read(), nhưng với dữ liệu số nguyên thay vì tham số mô tả tệp được đọc vào bộ đệm.
like_read(int data,void *buff,size_t nbytes);
Nó tương tự như read() ở chỗ nó sẽ đọc vào bộ đệm cùng giá trị mà read(0,buff,nbytes) đọc vào bộ đệm của nó từ đầu vào tiêu chuẩn. Ví dụ: khi tôi trực tiếp cung cấp địa chỉ số nguyên làm bộ đệm mà không sử dụng read(0,buff,nbytes) trước
int Số nguyên=25
int nbyte=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);//cho thiết bị xuất chuẩn
đóng(fd);
sản lượng dự kiến
25
Nội dung tệp/đầu ra thực tế là một số ký tự được mã hóa
, nó không mang lại cho tôi kết quả như mong muốn vì trước tiên tôi sử dụng read() để đọc số nguyên từ stdin vào bộ đệm và sau đó tôi sử dụng write() để ghi bộ đệm đó vào một tệp, ví dụ:
int Số nguyên;
int nbyte=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);//cho thiết bị xuất chuẩn
đóng(fd);
đầu vào tiêu chuẩn
25
sản lượng dự kiến
25
Nội dung tập tin/đầu ra thực tế
25
Khi tôi in giá trị bộ đệm sau read(0, buffer, nbytes), nó sẽ đưa ra một số giá trị được mã hóa:
int Số nguyên, 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, nbyte);
printf("\nGiá trị bộ đệm số nguyên %d\n",Số nguyên);
đóng(fd);
stdin 0 in "Giá trị bộ đệm số nguyên 2608", stdin 1 in "Giá trị bộ đệm số nguyên 2609", stdin 2 in "Giá trị bộ đệm số nguyên 2610",...stdin 9 in "Giá trị bộ đệm số nguyên 2617"...
Read() sử dụng mã hóa nào để chuyển đổi các giá trị số nguyên và làm cách nào để thực hiện việc đó mà không cần đọc()?
Tôi không chắc chắn bạn muốn đạt được điều gì, nhưng cách giải thích của tôi là bạn đang cố gắng kết hợp int
byte được sao chép vào bộ đệm. Điều này có thể đạt được như thế này:
#include
void like_read(int data, void *buff, size_t nbytes)
{
kích thước_t n;
/* Giới hạn số byte để sao chép từ biến dữ liệu */
n = sizeof(dữ liệu);
nếu (n < nbyte)
n = nbyte;
/* Sao chép byte từ biến dữ liệu vào bộ đệm */
memcpy(buff, &data, n);
/* Nếu bộ đệm đích lớn hơn biến dữ liệu, ... */
nếu (n < nbyte) {
/* ... đặt các byte còn lại ở đích thành 0 */
memset((char *)buff + n, 0, nbytes - n);
}
}
read() sử dụng mã hóa nào để chuyển đổi các giá trị số nguyên và làm cách nào tôi có thể thực hiện chuyển đổi đó mà không cần read()?
read()
Chỉ cần đọc các byte dữ liệu thô từ bộ mô tả tệp mà không cần bất kỳ chuyển đổi nào, ít nhất là trên các hệ thống loại POSIX (chẳng hạn như Unix và Linux). Một số hệ điều hành khác, chẳng hạn như Microsoft Windows, cho phép mở tệp bằng các cờ đặc biệt thực hiện một số chuyển đổi trên byte dữ liệu thô, chủ yếu để xử lý các tệp văn bản có các mã hóa khác nhau.
thích_đọc
trong chức năng memcpy()
Cuộc gọi sao chép byte dữ liệu thô từ vị trí bộ nhớ này sang vị trí bộ nhớ khác mà không có bất kỳ chuyển đổi nào.
biên tập
Tôi vẫn không chắc bạn (OP) đang cố gắng đạt được điều gì, nhưng dựa trên nhận xét của bạn bên dưới, có thể bạn đang tìm kiếm một hàm "in" một giá trị số nguyên dưới dạng ký tự ASCII thập phân vào bộ đệm có ký tự dòng mới , nhưng Cắt bớt theo số byte được chỉ định. Điều này gần như đã trôi qua snprintf()
để làm điều đó, nhưng hàm đó luôn ghi một byte rỗng kết thúc vào bộ đệm (nếu kích thước bộ đệm ít nhất là 1), vì vậy đó không phải là điều tôi nghĩ bạn muốn. Vì vậy,snprintf()
Có thể được sử dụng để in một giá trị số nguyên vào bộ đệm trung gian có kích thước đủ lớn và sau đó chuyển đổi kết quảmemcpy
In vào bộ đệm được chỉ định. Đây là một thực hiện:
#include
#include
void like_read(int data, void *buff, size_t nbytes)
{
char tempbuf[24]; /* phải đủ lớn... */
kích thước_t n;
/* In giá trị dữ liệu vào bộ đệm tạm thời */
n = snprintf(tempbuf, sizeof(tempbuf), "%d\n", data);
/* n là số byte sẽ được in ra tempbuf nếu có phòng */
/* Giới hạn số byte cần sao chép vào kích thước của bộ đệm tạm thời */
if (n > sizeof(tempbuf))
n = sizeof(tempbuf);
/* Giới hạn số byte để sao chép thành nbyte */.
nếu (n > nbyte)
n = nbyte;
/* Sao chép byte từ tempbuf vào bộ đệm */
memcpy(buff, tempbuf, n);
/* Nếu bộ đệm đích lớn hơn n, ... */
nếu (n < nbyte) {
/* ... đặt các byte còn lại ở đích thành 0 */
memset((char *)buff + n, 0, nbytes - n);
}
}
Tôi là một lập trình viên xuất sắc, rất giỏi!