从文件中正确读取

时间:2010-09-08 04:03:23

标签: c file-io

在我的课程中,

  1. 我将execv()的输出传递给一个文件,用于记录,(使用outCopy()函数)
  2. 然后将其打印回屏幕以模拟标准输出。 (使用printFile()函数)
  3. 这两个功能是:

    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
    

    如何更改其中一项或两项功能以获得正确的输出?

    (请不要建议使用管道或T恤,否则我将不得不更改我的exec()呼叫孩子的主要部分)

    修改:请注意outCopy()& printFile()父级运行。 孩子已将输出dup2()添加到所需的临时文件中。

2 个答案:

答案 0 :(得分:2)

某些版本的ls(包括Linux中使用的GNU版本)会检测它们是以终端还是使用管道作为标准输出运行,并更改其格式。如果你想要完全相同的输出,你需要使用posix_openpt调用和朋友创建一个伪TTY(pty)。或者您可以使用script实用程序,它会为您处理此问题。

另一种选择是使用-C ls选项来强制列式布局;但是,这可能不完全相同,因为ls不知道终端的宽度,并且可能假设宽度错误。此外,其他功能(如彩色输出)可能会丢失。

答案 1 :(得分:2)

当stdout不是tty时,ls会将用户友好列中的行为更改为脚本友好列表。无论附加设备stdout的类型如何,标志ls -C都会强制进行柱状输出。