【问题标题】:Using a char array as the file name in C with fopen()通过 fopen() 在 C 中使用 char 数组作为文件名
【发布时间】:2016-10-06 08:39:18
【问题描述】:

我正在用 C 语言编写一个程序,旨在允许用户输入文件名,以便程序可以读取该文件的内容。输入的格式必须是“/i:”,也就是说我必须去掉前三个字符才能得到文件名。

我将文件名存储在具有预设长度的字符数组中(因为我不知道用户将输入多长的文件名)。我使用的命令是:

achBaseOutput[100];
FILE * InputFile

//Instruct users on input

fgets(achBaseOutput, 100, stdin);

//Strips first three characters, scoots file name to start at achBaseOutput[0]

InputFile = fopen(achBaseOutput, "r");

当我执行代码时,我得到一个错误框,上面写着:

Debug Assertion Failed!
File: fgets.c
Line 57
Expression: (str != NULL)

很遗憾,文件名的输入格式不由我决定,所以我无法更改输入的 /i: 格式。

如何格式化输入字符串以便 fopen 接受它作为有效参数?

【问题讨论】:

  • fgets() 返回什么?失败的字符串的值是多少?
  • 该错误表明问题出在fgets,特别是achBaseOutput 可能为空。你能提供初始化它的代码吗?
  • @AndrewHenle:如果他在fgets 中遇到断言错误,则该函数可能不会返回,但程序会终止。
  • 请提供minimal reproducible example。所示的 sn-p 不应产生此行为(假设 achBaseOutputchar [100])。它也与您的问题无关。见How to Ask
  • 我一直在给 fgets() 本地文件的文件名(例如,在提示后我将输入“test”,然后按回车键。

标签: c arrays file char fopen


【解决方案1】:

首先你必须正确定义数组,使用类型

char achBaseOutput[100];

库函数fgets 保留您在行尾键入(或在文件中)的任何newline

可以这样去掉,(需要#include <string.h>):

achBaseOutput [ strcspn(achBaseOutput, "\r\n") ] = 0;   // remove trailing newline etc

您可以通过像这样打开文件来忽略而不是删除前 3 个字符:

InputFile = fopen(achBaseOutput + 3, "r");

【讨论】:

  • 我也没有看到这个回答错误。问题显然是str to fgets 的空指针。但是由于我们没有得到相关的代码,我们该如何回答呢?
  • @Olaf 我认为错误出现在看不见的代码//Strips first three characters, scoots file name to start at achBaseOutput[0] 中,这个答案显示了如何简单地准备和传递文件名。 OP 似乎也不知道 fgets 的工作原理。
  • @Olaf 问题是 “如何格式化输入字符串以便 fopen 接受它作为有效参数?” 这回答了它。
  • 考虑到断言的文本,我强烈反对它在fopen 中。 OP 似乎只是认为它就在那里,但信息显然不同。恐怕如果没有 MCVe,我们将不会在这里走得更远(显然 OP 对 actual 问题的正确答案不感兴趣)。
  • "不同意" --> "怀疑"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多