Почему буфер пропускает печать при вызове API записи системы?

#c #operating-system

Вопрос:

Я пытаюсь написать свою собственную cat программу. Я хочу печатать строку за строкой, но, похоже Write() , некоторые символы пропущены, и я не думаю, что у меня самое глубокое понимание, поэтому любые советы определенно будут приветствоваться.

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

Вот некоторые из моих кодов:

 #include <fcntl.h> // File Control Options // open(), STDOUT_FILENO
#include <unistd.h> // Access to POSIX operating system API // read(), write(), close()
#include <iostream>

const size_t BUFFERSIZE = 100;
const ssize_t FILE_DESCRIPTOR_ERROR = -1;
const size_t FILE_DESCRIPTOR_STANDARD_OUT = 1;
const size_t FILE_DESCRIPTOR_STANDARD_ERROR = 2;


ssize_t getline(size_t file_descriptor, char* buffer, size_t num_bytes_transferred) {

    size_t bytesUntilEndline = 0;
    char *pointer = buffer; 
    size_t ENDL_CHAR = 10;

    ssize_t bytesRead = read(file_descriptor, buffer, num_bytes_transferred);

    if (bytesRead > 0) {
        do {
            bytesUntilEndline  ;
            std::cout << bytesUntilEndline << ": " << *pointer << std::endl;
        } while ( (size_t) *pointer   != ENDL_CHAR);
    }

    std::cout << std::endl << "Bytes Read: " << bytesUntilEndline << std::endl << std::endl;

    return bytesUntilEndline;
}


int main(int argc, char *argv[]) {

    char buffer[BUFFERSIZE];
    ssize_t bytesRead;
    int counter = 0;

    if (argc == 1) {
        char message [] = "Read Failure: Please specify a filenamen";
        write(STDOUT_FILENO, message, sizeof(message)/ sizeof(message[0]));
        return 1;
    }

    ssize_t file_descriptor = open(argv[1], O_RDONLY);


    

    while ((bytesRead = getline(file_descriptor, buffer, BUFFERSIZE)) != 0 amp;amp; counter < 2) {
        std::cout << std::endl << "System Call STDOUT: " << std::endl; 
        write(STDOUT_FILENO, buffer, bytesRead);
        counter  ;
    }
 

вот мои выходные данные, когда я запускаю исполняемый файл: ./myCat myCat.cpp :

 1: #
2: i
3: n
4: c
5: l
6: u
7: d
8: e
9:
10: <
11: f
12: c
13: n
14: t
15: l
16: .
17: h
18: >
19:
20: /
21: /
22:
23: F
24: i
25: l
26: e
27:
28: C
29: o
30: n
31: t
32: r
33: o
34: l
35:
36: O
37: p
38: t
39: i
40: o
41: n
42: s
43:
44: /
45: /
46:
47: o
48: p
49: e
50: n
51: (
52: )
53: ,
54:
55: S
56: T
57: D
58: O
59: U
60: T
61: _
62: F
63: I
64: L
65: E
66: N
67: O
68:


Bytes Read: 68


System Call STDOUT:
#include <fcntl.h> // File Control Options // open(), STDOUT_FILENO
1:
2: P
3: O
4: S
5: I
6: X
7:
8: o
9: p
10: e
11: r
12: a
13: t
14: i
15: n
16: g
17:
18: s
19: y
20: s
21: t
22: e
23: m
24:
25: A
26: P
27: I
28:
29: /
30: /
31:
32: r
33: e
34: a
35: d
36: (
37: )
38: ,
39:
40: w
41: r
42: i
43: t
44: e
45: (
46: )
47: ,
48:
49: c
50: l
51: o
52: s
53: e
54: (
55: )
56:


Bytes Read: 56


System Call STDOUT:
 POSIX operating system API // read(), write(), close()
1:
2: =
3:
4: 1
5: 0
6: 0
7: ;
8:


Bytes Read: 8
 

Комментарии:

1. Похоже, что-то в Read() вызове не позволяет мне перечитывать значения, которые я пытаюсь выбросить .. т. Е. если я прочитал 100 байт в первом цикле и понял, что n это 50-й символ, следующий Read() начинается с байта 101… как я мог возобновить его на 51-м символе?

2. getline всегда считывает полные 100 символов. Затем он возвращает длину первой строки, поэтому вызывающий абонент печатает только это, но следующее чтение начнется со 101 — го символа, а не с начала второй строки.

3. @AlejandroArmas сохраните неиспользуемые байты где-нибудь, чтобы вы могли повторно использовать их в следующий раз, прежде чем снова читать файловый дескриптор. Или просто считывайте из файлового дескриптора по 1 байту за раз, пока не будет достигнут размер EOL или буфера.