【问题标题】:What could have possibly gone wrong? fopen bug [duplicate]可能出了什么问题? fopen错误[重复]
【发布时间】:2017-10-13 09:57:09
【问题描述】:

我的程序开头有以下 sn-p 代码:

printf("Starting extraction of file %s \n", tarName);

// Open the tarFile
FILE* tarFile = fopen(tarName, "r");
if(tarFile == NULL) return EXIT_FAILURE;

// Read nFiles
printf("Reading header...");
...

当我从终端执行它时,我得到以下输出:

Starting extraction of file test.mytar 

然后程序冻结,显然永远不会到达第二个printf

test.mytar 是与我的可执行文件位于同一文件夹中的现有文件,这是我执行终端的同一文件夹。

这个文件是我一个字节一个字节地创建的,所以它可能违反了我不知道的文件约定。

这里可能发生了什么?

【问题讨论】:

  • fopen 之后和 if 之前添加一个打印语句。打印出来了吗?
  • 你还应该展示函数是如何被调用的以及函数返回时执行的代码
  • ... 并在 all printf 中有一个 \n
  • @4386427 \n 刷新stdout 缓冲区是特定于平台的。确保缓冲区刷新的正确方法是禁用缓冲、显式设置行缓冲或实际刷新它。
  • @AndrewHenle 对于一个终端(我假设在那里),我认为它可以

标签: c file file-io


【解决方案1】:

正如 cmets 中指出的,可能会发生两件事。

a) fopen 失败(IO 错误、权限被拒绝、文件丢失……)。要知道确切的原因,您需要打印errno(或Windows 上的GetLastError()):

if(tarFile == NULL) {
    printf("%s\n", strerror(errno));
    return EXIT_FAILURE;
}

b) fopen 成功但printf("Reading header..."); 没有显示任何内容,因为消息已缓冲且尚未打印。要更正此问题,您通常可以在消息末尾添加'\n'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-06
    • 1970-01-01
    • 1970-01-01
    • 2021-08-17
    • 1970-01-01
    • 1970-01-01
    • 2019-01-31
    • 1970-01-01
    相关资源
    最近更新 更多