我使用pcdtojpeg解决方案将一些旧的.pcd图像转换为jpeg。由于我有很多图片,我正在编写一个C程序来自动化该过程。 我有适度的C#经验,但对C来说还是新手。
以下是我目前使用的一些占位符魔术数据
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int i=0;
for (i=0; i<90; i++)
{
if(i<10)
{
system("sudo ./pcdtojpeg img000%d.pcd", i);
}
else
{
system("sudo ./pcdtojpeg img00%d.pcd", i);
}
}
return 0;
}
编译器输出一个错误,定义了太多参数给系统函数,因为它可能不会占用任何参数。
我已经在网上搜索了大量的文档,例如cplusplus.com和linux.die.net,但是没有找到任何答案如何正确迭代C中的system()函数。
我正在运行
GCC 4.8.0
Linux 3.9.2-1-ARCH#1 SMP PREEMPT x86_64 GNU / Linux
答案 0 :(得分:4)
您不想“在system()
内进行迭代”。您想要做的是迭代围绕 system()
,以便您多次调用它。你的代码已经这样做了。缺少的部分是如何在每次调用时格式化命令。
为此,您应该使用snprintf()
:
char buf[1024];
snprintf(buf, sizeof buf, "sudo ./pcdtojpeg img%03d.pcd", i);
system(buf);
使用%
- 代码来格式化字符串的过程不是像你的代码所期望的那样内置在C语言中的东西。它只是由一组(库)函数实现的约定,如printf()
和snprintf()
。
%03d
格式代码表示“从int
插入一个十进制数字,并在左侧使用零填充它,使宽度变为3位数,总数”。因此,不需要if
。
答案 1 :(得分:4)
在这里借调Maxim Skurydin的评论。
你的C代码是一个简单的循环围绕shell调用。
在这种情况下,C是错误的技术。请改为使用shell脚本,并丢失sudo
,因为除了系统管理目的,您从不必须使用它:
for id in $(seq -f %04.f 0 89)
do
./pcdtojpeg img${id}.pcd
done
更快完成,很多在必要时更容易理解和更新。
(如果您想要触摸的文件可以使用模式匹配ls
收集,那么ShinTakezou确实打败了我更简单的解决方案。)