统计系统调用报告“没有这样的文件或目录”

时间:2012-02-01 23:16:04

标签: c

我正在进行家庭作业作业,我遇到了一些障碍。

我正在尝试从标准输入读取文件名,然后stat文件以获取大小(根据作业的要求):

#define BUFFSIZE 4096

int
main(void) {
    int n;

    char buffer[BUFFSIZE];

    struct stat buf;

    while ((n = read(STDIN_FILENO, buffer, BUFFSIZE)) > 0) {
        stat(buffer, &buf);
        perror("stat");
    }
}

这是运行时的输出(我输入了文件名file):

file
stat: No such file or directory

但如果我尝试这样的事情:

#define BUFFSIZE 4096

int
main(void) {
    int n;

    char buffer[BUFFSIZE] = "file";

    struct stat buf;

    stat(buffer, &buf);
    perror("stat");
}

我明白了:

stat: Success

名为file的文件位于我正在运行程序的目录中。

如何在读取字符串“file”和将数组初始化为字符串“file”之间有区别?

5 个答案:

答案 0 :(得分:4)

在致电stat()之前,将buffer的值打印到标准输出:

printf("[%s]\n", buffer);

这不是您所期望的,因为read()不会为您终止buffer。 在buffer之前初始化read()

不确定为什么要在read()上循环,因为在调用stat()之前应该获取文件的完整名称。如果您未被强制使用read(),请考虑使用fgets()

答案 1 :(得分:3)

您是否尝试过打印缓冲区?很可能你的read调用在字符串“file”的末尾返回了换行符,并且目录中没有文件“file \ n”。我建议使用fgets代替从控制台读取文件名。尽可能使用标准C输入/输出,并且只有在有可测量的好处时才委托给特定于平台的代码(例如,C标准库中没有跨平台stat函数,有时甚至是Unix I / O可以显着改善表现。)

答案 2 :(得分:3)

第一个代码段中的缓冲区中有一个'\n'。拿出来

buffer[strlen(buffer) - 1] = 0;

答案 3 :(得分:2)

问题是read将换行符留在缓冲区中,因此您尝试stat "file\n"

答案 4 :(得分:0)

read()可能在第一个循环中读取太多(或不够)。尝试在stat()调用之前打印出它的内容:

printf("Read %d characters (%s)\n",n,buf);

read()此任务可能有点低 - 我建议改用scanf()

while ( scanf ("%s",buffer) == 1) { 

对于安全代码,您需要指定要读取的最大字符数,您可以这样做:

while ( scanf ("%4096s",buffer) == 1) { 

但是,如果你想使用BUFFSIZE宏,你需要做一点mucking about

#define XLIM_PERCENT_S(x) "%" #x "s"
#define LIM_PERCENT_S(x) XLIM_PERCENT_S(x)  

....  

while ( scanf ( LIM_PERCENT_S( BUFFSIZE ) , buffer) == 1) {