【问题标题】:How to read Binary Files using command line argument and print it out in C?如何使用命令行参数读取二进制文件并在 C 中打印出来?
【发布时间】:2017-08-12 04:53:51
【问题描述】:

所以我有一个结构

struct records {
    short link; 
    double gate; 
    unsigned char bar;
    int rest; 
    char rink; 
};

现在我想读取二进制输入并使用fread() 将它们打印出来。我只是无法弄清楚到底该怎么做。

所以我只有

int main(int argc, char* argv[]){
}

首先,如何打开二进制文件?我在网上看到的所有示例都只使用main(),而在使用fopen() 时,它们总是指定输入。如何使用命令行参数来指定打开哪个文件?

然后,如何将这些文件读入我创建的struct 并打印出来?

任何帮助表示赞赏,非常感谢。

【问题讨论】:

  • 提示 1:您忘记了返回 main() 的结果的 return 0; 语句。提示 2:对提示 1 进行更改后,在 return 语句处设置断点并检查 argc 和 argv 的内容,同时为程序提供不同的命令行参数。

标签: c binaryfiles


【解决方案1】:

在运行程序时提供二进制文件的名称作为参数。

argv[0] 将是程序本身的名称和argv[1] 中的文件名。

正如评论中提到的Jonathan,在访问之前必须确保argv[1]确实存在,否则会导致错误。

有点像

if(argc<2)
{
    printf("\nError");
    return -1;
}

应该注意这一点。

那么做

FILE *fin=fopen(argv[1], "rb");

然后使用fread()从文件中读取。

fopen() 的第二个参数是打开文件的模式。 “rb”中的r和b分别表示读取和二进制。

对于fread(),首先创建一个变量,比如a,类型为struct records

然后使用

fread(&a, sizeof(a), 1, fin);

这里我们传递a的地址,以便读取的数据将存储在那里。 sizeof(a) 表示fread() 读取的每个块的大小,1 是应该读取的块数。

fread() 将返回成功读取的块数,在我们的例子中是1。 如果我们要求读取的块数和实际读取的块数不同,则说明文件已结束或发生错误。

之后我们可以访问a的每个元素。

https://www.tutorialspoint.com/c_standard_library/c_function_fread.htm http://pubs.opengroup.org/onlinepubs/009695399/functions/fread.html

【讨论】:

  • 非常感谢。我已经完成了错误处理,比如argc&lt;2,更像if(fin==null)。能否请您详细说明fread()
  • @AlonzoRobbe 我添加了更多内容。希望对您有所帮助。
  • 再次感谢。我有几个问题。首先,fread 中的1 是指它从struct 中读取的数量,还是指structs 中的数量。那么对于我的struct,还是1 还是5?其次,要访问a 的每个元素并打印它,我是否只需为a[1] 执行printf("%d", a[0]) 等等?最后,我们被告知“使用自己的fread 调用分别读取每个字段。”这和你说的有区别吗?
  • @AlonzoRobbe 1 是指块数,在这种情况下是单个 struct records。一个块将包含所有 5 个成员。所以它是1not 5。要访问a 的每个元素,您必须采用手动方式,即printf("%d,%lf,...", a.link, a.gate, ...)使用自己的fread() 分别读取每个字段,我的建议不太可能相同。而且我也不知道能不能做到。
  • @AlonzoRobbe 我猜每个字段的意思是linkgate
猜你喜欢
  • 2021-01-10
  • 2011-11-22
  • 2020-01-16
  • 1970-01-01
  • 1970-01-01
  • 2016-03-11
  • 2019-05-13
  • 2015-07-20
  • 1970-01-01
相关资源
最近更新 更多