0

我正在尝试编写一个可以在 Unix 环境中使用的程序。但是,这是我第一次做这样的事情,我对某些事情感到困惑。我的代码如下:

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

#define BUFFSIZE 4096

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

int n;
char buf[BUFFSIZE];

if (argc != 2){
    err_sys("usage a.out <pathname>");  
}

if (access(argv[1], R_OK) == -1){
    err_ret("access error for %s", argv[1]);
}

if (access(argv[2], R_OK) == 0){
    printf("Would you like to overwrite (Y or N)? \n");
    if(){
        exit(0);
    }
}

while ((n = read(STDIN_FILENO, buf, BUFFSIZE) > 0)){
    if (write(STDOUT_FILENO, buf, n) != n){
        err_sys("write error"); 
    }
}

if (n < 0){
    err_sys("read error");
}

close(STDOUT_FILENO);
close(STDIN_FILENO);

exit(0);

}

好的,所以基本上,我必须编写一个使用打开、读取、写入、关闭和访问的程序。但是,如果第二个参数(文件名)已经到位,我对如何实现必须提示用户覆盖或不覆盖的部分完全感到困惑。

也就是这些代码行:

if (access(argv[2], R_OK) == 0){
   printf("Would you like to overwrite (Y or N)? \n");
       if(){
           exit(0);
}

我不确定如何从用户那里获得响应以及条件是什么。

另外,如果我的其他代码有任何错误,请随时通知我并让我知道如何改进它。

谢谢!

刚刚添加:

if (open(argv[1], O_RDONLY) < 0){
    err_ret("open error for %s", argv[1]);
}
4

3 回答 3

0

使用 fgets(3) 或 readline(3),它们足够通用,可以在许多不同的场景中使用。避免使用 scanf(3) 因为它有问题,更多信息在这里

附带说明,请使用“size_t n”而不是“int n”。一般来说,您可以只使用 BUFSIZ,它是一个实现定义的值,并且在标题中很容易获得。另外,为什么在退出时关闭标准输入和标准输出?在您的程序中没有特定的理由这样做。

于 2012-09-10T20:00:46.370 回答
0

您可以使用 getchar() 或 scanf() 来获取用户输入。

于 2012-09-10T14:53:53.403 回答
0

要只读取一个字符,您可以调用 getchar() (stdio.h)(也有 scanf())。

样本:
c = getchar();
if(c == 'Y' || c == 'y'){ ... }
else if(c == 'N' || c == 'n'){ ... }
else { printf("Wrong option!") }

于 2012-09-10T02:48:04.800 回答