2017-10-10 54 views
0

我想从一个目录中获取一个文件并将其保存在内存中,目标是然后将文件结构中的信息按结构复制到一个tmp文件中,做一些编辑,然后将新信息保存在新的数据文件中。我现在想要做的就是获取文件,然后打印出来。在c中打印出一个数据文件是完全错误的

#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ÍÌ[email protected]³@RobertHenderson7ffÆ@BobbyNLMcÍ̼@BettyDurnanJPBFloodProfÀ@ 

我真的不知道什么是应该的样子完全相同,但它绝对不是。

+0

使用[GCC](http://gcc.gnu.org/).....编译所有警告和调试信息(例如'gcc -Wall -Wextra -g')。然后**使用调试器**'gdb';还可以使用一些八进制或六进制转储实用程序来了解文件的内容,例如[od](http://man7.org/linux/man-pages/man1/od.1.html) –

+1

乍一看,您的输出看起来与隐式文件格式兼容。 –

+1

像这样使用'access()'是毫无意义的。如果你打算使用它,在调用'fopen()'之前调用它,但是你不应该打扰。您应该检查文件是否在调用'fopen()'的函数中打开,而不是调用的函数。如果您不知道数据文件中的含义,我们将如何提供帮助?也许你需要显示写这些记录到程序中的程序。你用'fwrite()',不是吗?为什么不使用'fread()'来读回记录? –

回答

1

这将使意义,如果不管写的文件正在写的hw5_struct

二进制版本如果这是阅读,你需要做相应的二进制文件加载该文件的情况下

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

HW5_struct tempStruct;

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

然后,您可以通过打印位将其分开。

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

您当前所读取的代码将只对一个文本文件的工作。

+0

我对C很新,这对我有很大的帮助并解决了我的问题,谢谢! –

+0

好东西。 C很棘手。一个很好的基础,但是当你转向更现代的语言时,这个怪异的大部分会消失(或者至少会有所改变!)。随时接受答案,并给予我渴望的声誉:) – LoztInSpace