关于使用低级功能

时间:2017-11-04 13:14:03

标签: c linux

我接受了评论并重写了代码。但它仍然无法奏效。 我打开一个包含几个句子的文本文件,将小写字母更改为大写字母,然后尝试在另一个文件中输入它们。 我不太清楚如何使用read()的第三个参数。 我该如何更正代码?

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>

int main()
{
    int fp,ftp,i,nread;
    char str[300];


    if(fp=open("text_in",O_RDONLY) < 0)
    {
            perror("open: ");
            exit(1);
    }

    if(ftp=open("text_w", O_WRONLY |O_CREAT , 0644) < 0)
    {
            perror("open: ");
            exit(1);
    }


    nread=read(fp,str,300);

    for(i=0; i<=nread; i++)
    {
            if((str[i] >= 'a') && (str[i] <= 'z'))
            {
                    str[i] -= ('a'-'A');
            }
    }

    write(ftp,str,nread);


    close(fp);
}

1 个答案:

答案 0 :(得分:0)

以下提议的代码:

  1. 将评论纳入问题
  2. 记录每个头文件包含的原因
  3. 通过使用toupper()
  4. 澄清了一些代码
  5. 正确检查错误
  6. 自我清理后
  7. 使用有意义的变量名称
  8. 通过给出有意义的名字
  9. 来消除'魔术'数字
  10. 遵循公理:每行只有一个语句,并且(最多)每个语句一个变量声明。
  11. 干净地编译
  12. 执行从输入文件中读取块(最多300个字符)所需的功能,将所有小写字符转换为大写,将更新的行输出到新文件。
  13. 现在,建议的代码:

    #include <stdio.h>    // perror()
    #include <stdlib.h>   // exit()
    #include <fcntl.h>    // open(), O_RDONLY, O_WRONLY, O_CREAT
    #include <unistd.h>   // read(), write(), close()
    #include <ctype.h>    // toupper()
    
    #define BUF_LENGTH 300
    
    int main( void )
    {
        int fdi;
        int fdo;
        char buffer[ BUF_LENGTH ];
    
    
        if( (fdi=open("text_in",O_RDONLY)) < 0)
        {
                perror("open: ");
                exit(1);
        }
    
        if( (fdo=open("text_w", O_WRONLY |O_CREAT , 0644)) < 0)
        {
                perror("open: ");
                close( fdi );  // cleanup
                exit(1);
        }
    
    
        ssize_t nread = read( fdi, buffer, BUF_LENGTH );
        if( nread <= 0 )
        { // then EOF or read error
            perror( "read failed" );
            close( fdi );
            close( fdo );
            exit( 1 );
        }
    
        for( ssize_t i=0; i<=nread; i++ )
        {
                buffer[i] = (char)toupper( buffer[i] );
        }
    
        ssize_t nwritten = write( fdo, buffer, (size_t)nread );
        if( nwritten != nread )
        {
            perror( "write all, bytes failed" );
        }
    
        close(fdi);
        close(fdo);
    }