Правильное чтение из файла - PullRequest
1 голос
/ 08 сентября 2010

Во время моей программы,

  1. Я передаю вывод execv () в файл для ведения журнала (используя функцию outCopy ())
  2. , а затем распечатайте его обратно на экран для имитации вывода стандартного вывода. (используя функцию printFile ())

2 функции:

void printFile(char *fileName)
{
    char *fileContent=(char *)malloc(200*sizeof(char));                 /* sufficiently large buffer */
    if((filePtr=fopen(fileName,"r"))==NULL)
    {
        printf("Error opening %s: %s\n",fileName,strerror(errno));
        if( (strcmp(fileName,"/tmp/command.log")==0) || (strcmp(fileName,"/tmp/output.log")==0) ){exitStatus=255;}
    }
    else
    {
        while(fscanf(filePtr,"%s",fileContent)!=EOF)   
        {
            printf("%s",fileContent);
            printf("%c",fgetc(filePtr));
        }
        fclose(filePtr);
    }
}

void outCopy(char *fileName)   
{
    char *fileContent=(char *)malloc(200*sizeof(char));                 /* sufficiently large buffer */
    if( (filePtr=fopen(fileName,"r"))==NULL || (filePtr2=fopen("/tmp/output.log","a"))==NULL )
    {
        printf("Error opening files: %s\n",strerror(errno));
    }
    else
    {
        while(fscanf(filePtr,"%s",fileContent)!=EOF)   
        {
            fprintf(filePtr2,"%s",fileContent);
            fprintf(filePtr2,"%c",fgetc(filePtr));
        }
        fclose(filePtr);
        fclose(filePtr2);
    }
}

Однако моя аккуратная маленькая схема нарушается для вывода команды ls:

Ожидаемый результат:

a.c c.c e.c
b.c d.c

Токовый выход:

a.c
b.c
c.c
d.c
e.c

Как я могу изменить одну или обе мои функции, чтобы получить правильный вывод?

(Пожалуйста, не предлагайте использовать каналы или тройники, иначе мне придется изменить основную часть моего exec (), вызывающего child)

Редактировать: Обратите внимание, что оба outCopy() и printFile() управляются родительским . child .

выводит dup2() в нужный временный файл.

Ответы [ 2 ]

2 голосов
/ 08 сентября 2010

Когда стандартный вывод не является tty, ls изменяет поведение с удобных для пользователя столбцов на дружественные к сценариям списки. Флаг ls -C принудительно выводит столбец независимо от того, к какому типу устройства подключен стандартный вывод.

2 голосов
/ 08 сентября 2010

Некоторые версии ls (включая версию GNU, используемую в Linux) определяют, работают ли они с терминалом или с каналом в качестве стандартного вывода, и изменяют свое форматирование. Если вы хотите точно такой же вывод, вам нужно создать псевдо-TTY (pty), используя вызов posix_openpt и друзей. Или вы можете использовать утилиту script, которая позаботится об этом за вас.

Другой вариант - использовать параметр -C для ls, чтобы принудительно использовать столбчатую разметку; однако это может не совпадать, поскольку ls не будет знать ширину вашего терминала и может принять неправильную ширину. Кроме того, могут отсутствовать другие функции, такие как цветной вывод.

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