2014-01-12 107 views
0

從我寫入的文件讀取有問題,它顯示奇怪的令牌,而不是我嘗試打印的文本。這可能只是一個簡單的解決方案,但我找不到它。在這裏坐了幾個小時吧! :/使用fread從文件讀取的奇怪文本

http://imgur.com/syiJCPS

#include <stdio.h> 
#include <string.h> 
#include <malloc.h> 
#include <stdlib.h> 
//#include "allafunktioner.h" 

struct vinnare{ 
    int ar; 
    char namn[20]; 
}; 
struct vinnare *inlasningTillFil(struct vinnare *vinnare, int antalvinnareinlasning); 
int meny(); 

int vinnarear(int ar, char namnlista, int vinnare); 
void artistnamn(int ar, char namnlista, int vinnare); 
void skrivutalla(int ar, int namnlista, int vinnare); 

main(){ 
    int a=1, val, antalvinnareinlasning,test=0; 

    struct vinnare *vinnare; 

    FILE *file; 
    file = fopen("F:\\Uppgifter", "rb"); 

    if (file == NULL){ 

     vinnare = NULL; 
     printf("Ange antal vinnare:"); 
     scanf("%d", &antalvinnareinlasning); 
     vinnare = (struct vinnare *)malloc(antalvinnareinlasning*sizeof(struct vinnare)); 
     vinnare = inlasningTillFil(vinnare, antalvinnareinlasning); 
    } 
    else{ 

     fread(&antalvinnareinlasning, sizeof(int), 1, file); 
     printf("%d", antalvinnareinlasning); 
     vinnare =(struct vinnare *)malloc(antalvinnareinlasning*sizeof(struct vinnare)); 

     for (a = 1; a < (antalvinnareinlasning + 1); a++){ 
      fread(&vinnare[a].ar, sizeof(int), 1, file); 
      fread(&vinnare[a].namn, sizeof(char)*20, 1, file); 
      printf("%d", vinnare[a].ar); 
      printf("%s", vinnare[a].namn); 
     } 


    } 
    fflush(stdin); 
    getchar(); 
} 


struct vinnare *inlasningTillFil(struct vinnare *vinnare, int antalvinnareinlasning){ 
    int a, temp; 

    FILE *file; 
    file = fopen("F:\\Uppgifter", "wb"); 

    vinnare[0].ar = antalvinnareinlasning; 


    fwrite(&vinnare[0], sizeof(struct vinnare),1, file); 


    for (a = 1; a < (antalvinnareinlasning + 1); a++){ 
     printf("Ange vilket år du vill mata in: "); 
     scanf("%d", &temp); 
     vinnare[a].ar = temp; 
     fflush(stdin); 

     printf("Ange vinnaren för det året:"); 
     fgets(vinnare[a].namn, 20, stdin); 
     fflush(stdin); 

     fwrite(&vinnare[a], sizeof(struct vinnare), 1, file); 
    } 

} 
+0

'struct vinnare'的定義是什麼?你打開文件以二進制模式閱讀('「rb」')嗎? –

+0

發佈一個完整的,可編譯的程序,以及一些示例輸入和不正確的輸出。 – Gilles

+0

現在我添加了整個代碼和圖片:) – Prolle

回答

1

當你第一次讀入文件,你讀的記錄數的int

fread(&antalvinnareinlasning, sizeof(int), 1, file); 

但是,當你寫的文件,你要做的第一件事是寫一個初始化struct vinnare

fwrite(&vinnare[0], sizeof(struct vinnare),1, file); 

所以,你的文件格式不排隊,你最終從int二進制數據你的char字段。

此外,如果您的結構中有填充物,我會建議您的fread與您的fwrite完全相同。 sizeof(struct vinnare)在不guarenteeded是完全一樣sizeof(int) + sizeof(char[20]),因此:

fread(&vinnare[a].ar, sizeof(int), 1, file); 
fread(&vinnare[a].namn, sizeof(char)*20, 1, file); 

不是同一一定的

fread(&(vinnare[a]), sizeof(struct vinnare), 1, file) ; 

最後,在內存中分配N記錄存儲struct,但是你用錯誤的。您需要在您的for循環中索引0N-1而非1NinlasningTillFil。最後一個讀取的地址是&vinnare[N],這是無效的。

+0

幾乎! :D它仍然在開始寫入相同的數字。將所有sizeof更改爲sizeof(struct vinnare)。現在很近!! :) – Prolle

+0

did not有所作爲,問題是,它的工作,如果我只有兩個結構,第一個告訴有多少結構在文件中(我的任務必須),但只要我有超過2它顯示了第一年,然後名稱分解:/ http://imgur.com/ANTCSAZ – Prolle

+0

修復'vinnare'上的索引。在C索引中以'0'開頭。 – woolstar

相關問題