2017-10-10 19 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