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