【问题标题】:Print out of a data file in c is completely wrong在c中打印出数据文件是完全错误的
【发布时间】:2018-03-21 09:33:38
【问题描述】:

我正在尝试从目录中获取文件并将其保存在内存中,目标是然后将文件结构中的信息逐个结构复制到 tmp 文件中,进行一些编辑,然后将新信息保存在新数据中文件。我现在要做的就是获取文件然后打印它。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

typedef struct hw5_struct {
    char f_name[12];
    char l_name[12];
    int age;
    float height;
}HW5_struct;

void printThisFile( FILE *data );

int main( int argc, char *argv[] ) {
    const char *fileLocation = argv[1];

    FILE *originalData = fopen( fileLocation, "r" );

    if( access( fileLocation, F_OK ) != -1 )
        printf("The file at %s exists\n", argv[1]);

    printThisFile( originalData );

    //int sizeOfOriginalData = sizeOf( &originalData );

}

void printThisFile( FILE *data ) {
    printf( "printThisFile called\n" );

    int c;
    if ( data ) {
        printf( "printing file contents now:\n" );
        while( ( c = getc( data ) ) != EOF )
            printf("%c", c);
        fclose( data );
    }
}

它打印以下内容:

FredHutcheson À@LarryStarchÍ̼@LucyLu-FredFlintstone 33£@BarnyRubbleÍÌl@AmandaHelix33³@RobertHenderson7ffÆ@BobbyNLMcÍ̼@BettyDurnanJPBFloodProfÀ@

我真的不知道它应该是什么样子,但绝对不是那样。

【问题讨论】:

  • 编译所有警告和调试信息(所以gcc -Wall -Wextra -gGCC.....)。然后使用调试器 gdb;还可以使用一些八进制或六进制转储实用程序来了解文件的内容,例如od
  • 乍一看,您的输出看起来与您的隐式文件格式兼容。
  • 像这样使用access() 几乎毫无意义。如果您要使用它,请在拨打fopen() 之前拨打它,但您不应该打扰。您应该检查文件是否在调用fopen() 的函数中打开,而不是在被调用函数中打开。如果您不知道数据文件中的含义,我们将如何提供帮助?也许您需要显示将这些记录写入文件的程序。你用了fwrite(),不是吗?为什么不使用fread() 读回记录呢?

标签: c file io fopen


【解决方案1】:

如果编写该文件的人正在编写hw5_struct 的二进制版本,这将是有意义的

如果是这种情况,您需要通过执行相应的二进制读取来加载文件

FILE *originalData = fopen( fileLocation, "rb" );

HW5_struct tempStruct;

fread ( &amp;tempStruct, sizeof(hw5_struct),1, data);

然后您可以通过打印这些位来将其拆开。

printf("%s %s %d %f\n", tempStruct.f_name, tempStruct.l_name,tempStruct.age, tempStruct.height);

您当前读取的代码仅适用于文本文件。

【讨论】:

  • 我是 C 的新手,这对我有很大帮助并解决了我的问题,谢谢!
  • 好东西。 C 很棘手。一个很好的基础,但是当您更改为更现代的语言时,大多数这种怪异现象都会消失(或者至少会发生一些变化!)。随意接受答案并给予我渴望的声誉:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-10
  • 1970-01-01
相关资源
最近更新 更多