从stdin(C)获取多个文件的文件大小

时间:2015-03-03 09:25:32

标签: c filenames stdin

我正在尝试从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;

}

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位,在这种情况下,即使是一些相对较小的文件也可能溢出它。