我正在进行家庭作业作业,我遇到了一些障碍。
我正在尝试从标准输入读取文件名,然后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”之间有区别?
答案 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) {