2017-10-10 19 views
0

J'essaie d'obtenir un fichier à partir d'un répertoire et de le garder en mémoire, le but est alors de copier les informations de la structure de fichier par structure dans un fichier tmp, faire édition, puis enregistrez les nouvelles informations dans un nouveau fichier de données. Tout ce que j'essaie de faire maintenant est d'obtenir le fichier et ensuite l'imprimer.Impression d'un fichier de données dans c est complètement faux

#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); 
    } 
} 

Il imprime les éléments suivants:

FredHutcheson À@LarryStarchÍ̼@LucyLu-FredFlintstone 33£@BarnyRubbleÍÌ[email protected]³@RobertHenderson7ffÆ@BobbyNLMcÍ̼@BettyDurnanJPBFloodProfÀ@ 

Je ne sais pas vraiment ce qu'il est censé ressembler exactement, mais son certainement pas.

+0

Compilez avec toutes les informations d'avertissement et de débogage (donc 'gcc -Wall -Wextra -g' avec [GCC] (http://gcc.gnu.org/) .....). Ensuite ** utilisez le débogueur ** 'gdb'; utilisez également un utilitaire de vidage octal ou hexa pour comprendre le contenu du fichier, par ex. [od] (http://man7.org/linux/man-pages/man1/od.1.html) –

+1

À première vue, votre sortie semble compatible avec votre format de fichier implicite. –

+1

L'utilisation de 'access()' comme cela est inutile. Si vous voulez l'utiliser, appelez-le avant d'appeler 'fopen()', mais vous ne devriez pas le déranger. Vous devriez vérifier que le fichier a été ouvert dans la fonction qui appelle 'fopen()', pas la fonction appelée. Si vous ne savez pas ce que le fichier de données doit contenir, comment pouvons-nous vous aider? Peut-être que vous devez montrer le programme qui a écrit ces enregistrements dans le fichier. Vous avez utilisé 'fwrite()', n'est-ce pas? Pourquoi ne pas utiliser 'fread()' pour lire les enregistrements? –

Répondre

1

Cela serait logique si tout écrit que les versions binaires était en train d'écrire le fichier de hw5_struct

Si tel est le cas, vous devez charger le fichier en faisant la lecture binaire correspondant

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

HW5_struct tempStruct;

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

Vous pouvez ensuite le séparer en imprimant les bits.

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

Votre code de lecture actuelle ne fonctionne qu'avec un fichier texte.

+0

Je suis très nouveau à C et cela m'a beaucoup aidé et a résolu mon problème merci! –

+0

Bonnes choses. C est difficile. Une bonne base mais la plupart de cette étrangeté disparaît (ou du moins change un peu!) Lorsque vous changez de langue plus contemporaine. N'hésitez pas à accepter la réponse et à donner la réputation dont j'ai envie :) – LoztInSpace