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

Get the file sizes of multiple files from stdin (C)

我正在尝试从 stdin 的 1 行中读取并获取多个文件的总文件大小。如果有 1 个文件,下面的代码可以完美运行,但如果有多个文件,它就会失败,因为它无法区分 1 个文件何时结束和另一个文件何时开始。文件名由空格分隔(例如:echo "file1.txt file2.txt"),有人可以指出我如何单独评估每个文件名大小的正确方向吗?为简洁起见,未包含文件大小函数

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 = '[=10=]';


        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;

}

使用 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 首先消耗前导空白,然后读取一系列非空白字符。 return 值 1 表示字符串已成功读取(警告:scanf 实际上 return 匹配的输入项数;请参阅手册!)。

最大字段宽度说明符(%1023s 中的 1023)是避免 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 = '[=11=]';

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