LINUX.ORG.RU

Чтение stdin

 ,


1

3

Проблема следующего характера: программа принимает аргумент длинной более 5000 символов из командной строки, однако при чтении обрезается до 4095 символов.
Пример:

QTextStream qcin(stdin);
QByteArray str;
qcin >> str;
Также пробовал:
str.clear();
str.append(qcin.readLine(10000));

Также пробовал использовать стандартную библиотеку <iostream> и setbuf(). Во всех случаях обрезается до 4095.


из командной строки
4096

а максимальная длина команды в твоей системе какая?

bvn13 ★★★★★
()

Читай поблочно

XMs ★★★★★
()
alf@xxx-dev:~$ xargs --show-limits
Your environment variables take up 2005 bytes
POSIX upper limit on argument length (this system): 2093099
POSIX smallest allowable upper limit on argument length (all systems): 4096
Maximum length of command we could actually use: 2091094
Size of command buffer we are actually using: 131072
vtVitus ★★★★★
()

Командная строка не читается из stdin, а передается в параметрах main (int argc, char *argv[]). Максимальную длину для твоего шелла можно узнать выдав команду

$ getconf ARG_MAX

Bobby_
()
Ответ на: комментарий от Bobby_

$getconf ARG_MAX результат 2097152
Как мне тогда через stdin считать аргумент длиннее 4096 символов? за исключением способа разбиения на блоки, предложенного выше

Bers0
() автор топика
Ответ на: комментарий от Bers0

Тебе чего надо, командную строку или ввод из stdin?

Если последнее


#include <string>
#include <iostream>
 
int main()
{
    std::string input_string;
    std::getline(std::cin, input_string);
    std::cout << input_string << std::endl;
}

Максимальная длина строки string.max_size ().

Bobby_
()
Ответ на: комментарий от Bobby_

Спасибо за помощь, не особо разбирал разницу между вводом через stdin и вводом с командной строки. Запустил прогу с изначальным вариантом:

QTextStream qcin(stdin);
QByteArray str;
qcin >> str;
и длинные аргументы прекрасно считывались.
Остался только вопрос, как поступать, если при отладке необходимо через командную строку вводить длинные аргументы, превышающие длину 4096 символов.

Bers0
() автор топика
Ответ на: комментарий от Bers0

Не вводить такие аргументы, а передавать данные как-то ещё, например, через тот же stdin

XMs ★★★★★
()
Ответ на: комментарий от rumgot

Потому что использую классы QByteArray и QString

Bers0
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.