我正在尝试从stdin的1行读取并获取多个文件的文件大小。如果有1个文件,则下面的代码可以正常工作,但如果有多个文件失败,则无法区分1个文件何时结束而另一个文件何时开始。文件名由空格分隔(例如:echo" file1.txt file2.txt"),是否有人能指出我如何分别评估每个文件名的大小?为简洁起见,未包括filesize函数
int main (int argc, char *argv[])
{
char tmpstring[1024];
const char* fileName;
off_t size;
char* pos;
int total = 0;
//read from stdin
while (fgets(tmpstring, 1024, stdin))
{
fileName = tmpstring;
if ((pos=strchr(fileName, '\n')) != NULL)
*pos = '\0';
printf("this is the name: %s\n", fileName); //#DEBUG
size = filesize(fileName);
total += size;
//} #DEBUG
}
printf("This is the total: %d\n", total); //#DEBUG
return -1;
}
答案 0 :(得分:0)
如何使用scanf
代替:
int main() {
char buffer[1024];
int total = 0;
while (scanf("%1023s", buffer) == 1) {
printf("this is the name: %s\n", buffer);
total += filesize(buffer);
}
printf("This is the total: %d\n", total);
return 0; // You shouldn't return -1!
}
scanf
首先使用前导空格,然后读取一系列非空白字符。返回值1表示已成功读取字符串(警告:scanf
实际返回匹配的输入项数;请参阅手册!)。
最大字段宽度说明符(1023
中的%1023s
)是避免buffer overflow vulnerability所必需的。如果我省略它,就可以将长度超过1023个字符的字符串提供给scanf
。存储空终止符需要额外的字符。
注意:这种方法的一个(可能不合需要的)副作用是没有必要在一行中输入所有文件名。如果您不想要这种行为,那么修改您的初始方法就可以解决问题:
int main(int argc, char *argv[]) {
char buffer[1024];
const char* fileName;
int total = 0;
char *pos;
// Read from stdin. You should do some error checking too.
fgets(buffer, sizeof buffer, stdin);
// Get rid of the trailing '\n'.
if ((pos = strchr(buffer, '\n')) != NULL)
*pos = '\0';
fileName = strtok(buffer, " ");
while (fileName) {
printf("this is the name: %s\n", fileName);
total += filesize(fileName);
fileName = strtok(NULL, " ");
}
printf("This is the total: %d\n", total);
return 0;
}
另外,您不应该使用int
来表示文件大小。很可能int
在你的机器上只有32位,在这种情况下,即使是一些相对较小的文件也可能溢出它。