fread或fwrite给出"错误的文件号"

时间:2016-10-04 04:40:01

标签: c gcc fwrite fgets

我在Windows 8.1中使用MinGW,我有一个原始数字的输入文本文件(每行一个),我想在新的二进制文件中将它们写成二进制文件。该示例正在编译中没有问题:

gcc -pedantic -Os -c my_code.c -o my_code.exe

但输出是

$ my_code.exe
sh: ./my_code.exe: Bad file number

这是我写的代码:

#include<stdio.h>

int main ()
{
    FILE *fp;
    FILE *prob;
    int length;
    char buffer[30];

   // Open file containing numbers
    if ((prob = fopen("raw_numbers.txt","r")) == NULL)
    {
        printf("Could not open raw_numbers.txt\n");
        exit(1);
    }

    /* Create output binary file */
    fp = fopen( "file.bin" , "w" );

    while( ! feof(prob) )
    {
        fgets(buffer, sizeof(buffer), prob);
        fwrite((const void*) & buffer, 1, sizeof(buffer), fp);
    }

    fclose(prob);
    fclose(fp);
    return(0);
}

使用

$ gcc --version
gcc (GCC) 3.4.4 (msys special)

1 个答案:

答案 0 :(得分:4)

您的计划中有多处错误:

  • 您应该测试无法创建输出文件。

  • 您应该测试fgets()的返回值,而不是使用while (!feof())...,而buffer无法按照Why is “while ( !feof (file) )” always wrong?

  • 中的说明进行操作
  • 您应该将fwrite传递给&buffer而不是strlen(buffer)

  • 你应该传递要写入的字节数(#include <errno.h> #include <stdio.h> #include <stdlib.h> int main(void) { FILE *fp; FILE *prob; int value; char buffer[30]; /* Open file containing numbers */ if ((prob = fopen("raw_numbers.txt", "r")) == NULL) { printf("Could not open raw_numbers.txt: %s\n", strerror(errno)); exit(1); } /* Create output binary file */ if ((fp = fopen("file.bin", "wb")) == NULL) { printf("Could not open file.bin: %s\n", strerror(errno)); exit(1); } while (fgets(buffer, sizeof(buffer), prob) != NULL) { value = atoi(buffer); if (fwrite(&value, sizeof(value), 1, fp) != 1) { printf("Error writing to file.bin: %s\n", strerror(errno)); exit(1); } } fclose(prob); fclose(fp); return 0; } )而不是缓冲区的大小。

  • 您说输出文件应该是二进制文件,但是您将其作为文本文件打开并向其写入文本。您的意思是将数字转换为二进制并编写二进制表示吗?

以下是实现上述内容的替代方法:

my_code.exe

shell诊断具有误导性,但这意味着:文件gcc -pedantic -Os -c my_code.c -o my_code.exe具有一个未被识别为可执行文件的签名(也称为幻数)。内核无法确定如何从其幻数运行文件,因此错误的文件号

原因是您的编译命令:my_code.c将源文件-c编译为对象格式,而不是直接链接到可执行格式。删除gcc -pedantic -Os my_code.c -o my_code.exe 选项以一步编译和链接:

{{1}}