将多个txt文件中的文件名参数传递给在linux终端中运行的c程序



我有一个项目,需要将.bin文件的大列表转换为.csv文件的等效大列表。转换器脚本已经由一家名为agilent的公司用c编写,catch 22是该脚本一次只转换一个.bin文件。但一旦转换,它将是我的项目的正确格式

当我手动键入参数时,c程序(称为agilent_bin_reader.c(运行良好,但当参数来自.txt文件时,文件打开器无法打开该文件。我想让这个过程自动化,运行c程序数千次,所以我创建了一个script.sh,重复这个过程,直到其中一个txt文件的EOF。

手动输入示例(linux_shell$ ./agilent_bin_reader des_trace1.bin trace1.csv

将des_trace1.bin中的二进制信息完美地保存到trace1.csv中。

我的问题是,当我使用script.sh运行这个c程序时,我得到的错误是文件基本上无法打开。这是c代码的这一部分的问题:

inputFile = fopen(argv[1], "rb");
if (inputFile)

因为if永远不会计算为true。接下来的其他内容基本上将我踢出了代码。

这是我创作的剧本:

while 
IFS= read -r a1 <&3 &&
IFS= read -r a2 <&4
do
./agilent_bin_reader "$a1" "$a2" 3<&- 4<&-
done 3< names1.txt 4< names2.txt

可以看到,这里的参数是names1.txtnames2.txt,因为它们分别传递到argv[1]和argv[2]中。但是,即使参数设置得很好,这几乎就像fopen认为它应该在names1.txt文件中查找.bin文件,但实际上.bin文件与agilent_bin_reader.c、names1.txt位于同一文件夹中,和names2.txt。目录应该不会有任何问题,除非我的script.sh使fopen只查看argv[]进入的.txt文件。

我想让代码基本上做到这一点:

linux_shell$ ./agilent_bin_reader names1.txt(1st line) names2.txt(1st line)
linux_shell$ ./agilent_bin_reader names1.txt(2nd line) names2.txt(2nd line)
linux_shell$ ./agilent_bin_reader names1.txt(3rd line) names2.txt(3rd line)
....
....
linux_shell$ ./agilent_bin_reader names1.txt(81,569th line) names2.txt(81,569th line)
*EOF of both .txt files, iteration complete

我的names1.txt文件看起来像:

des_trace1.bin
des_trace2.bin
des_trace3.bin
...
des_trace81569.bin

我的names2.txt文件看起来像:

trace1.csv
trace2.csv
trace3.csv
...
trace81569.csv

这是提供给我的转换器代码(位于http://www.dpacontest.org/agilent_bin_reader.c){我把这个程序命名为agilent_bin_reader.c,就像创建它的公司一样}

Shawn在评论部分发现我的问题是我的txt文件中有隐藏字符。。运行dos2unix,我的问题立刻消失了。有关详细说明,请访问此网站:https://www.liquidweb.com/kb/dos2unix-removing-hidden-windows-characters-from-files/

以下是我运行的命令:

linux_shell$ sudo apt install dos2unix
linux_shell$ dos2unix names1.txt
linux_shell$ dos2unix names2.txt

最新更新