2012-02-01 69 views
2

我正在做一个作业任务,我遇到了一个小障碍。统计系统调用报告“没有这样的文件或目录”

我试图从标准输入读取一个文件名,然后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”之间存在差异?

回答

4

调用stat()打印buffer值到标准输出之前:

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

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

不知道为什么你在read()上循环,因为你应该在调用stat()之前获取文件的完整名称。如果你还没有被迫使用read()考虑使用fgets()

3

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

+0

感谢您的建议,但该任务要求我使用'read'和'stat'。 – amillerrhodes 2012-02-01 23:39:03

3

在第一个片段的缓冲区中有一个'\n'。把它拿出来

buffer[strlen(buffer) - 1] = 0; 
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) { 
2

问题是read在缓冲区中留下换行符,所以您尝试stat"file\n"

相关问题