2017-04-06 3 views
0

En essayant de copier un fichier mal dans un fichier texte. Donc, fondamentalement, je veux que le contenu du fichier mal à copier dans le fichier texte. le fichier mal est nommé test1.mal et le fichier txt est le nom output.txt. C'est ce que j'ai mais ça continue d'imprimer erreur en lisant le fichier.copier des fichiers dans le programme C?

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



int main(void) { 

char content[255]; 
char newcontent[255]; 

FILE *fp1, *fp2; 
fp1 = fopen("test1.mal", "r"); 
fp2 = fopen("output.txt", "w"); 

if(fp1 == NULL || fp2 == NULL) 
{ 
printf("error reading file\n"); 
exit(0); 
} 
printf("files open correct\n"); 
while(fgets(content, sizeof (content), fp1) !=NULL) 
{ 
fputs(content, stdout); 
strcpy (content, newcontent); 
} 

printf("%s", newcontent); 
printf("text received\n"); 

while(fgets(content, sizeof(content), fp1) !=NULL) 
{ 
fprintf(fp2, newcontent); 
} 
printf("file created and text copied"); 

fclose(fp1); 
fclose(fp2); 
return 0; 
} 
+0

qui est parce que le fichier n'existe pas dans le répertoire courant (que vous devriez essayer d'imprimer en utilisant 'getcwd()') –

+0

'if (FP1 == NULL || FP2 == NULL)' êtes-vous sûr ? – Michi

+3

Utilisez 'perror' au lieu de' printf' pour imprimer le message d'erreur. Cela vous indiquera ** pourquoi ** l'appel de la fonction précédente a échoué. En outre, vérifiez l'erreur séparément pour chaque appel 'fopen' afin de savoir lequel a échoué. – dbush

Répondre

3

Le code affiché a plusieurs problèmes, dont beaucoup sont exprimés dans les commentaires à la question OP.

Le code suivant est une façon d'effectuer l'opération souhaitée.

Il compile proprement et effectue la vérification appropriée erreur

Note: les appels à perror() sortie volonté, à stderr, le texte ci-joint et la raison pour laquelle le système d'exploitation pense que l'opération a échoué.

Note: utilisé open(), close(), read(), write() parce qu'il n'y a aucune garantie que l'entrée fichier .mal ne contient pas de caractères NUL intégrés.

#include <stdio.h> // perror() 
#include <stdlib.h> // exit(), EXIT_FAILURE 


#include <unistd.h> // read(), write(), close() 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> // open() 

// declare the size of the buffers with a meaningful name 
// do not use 'magic' numbers 
#define BUFF_SIZE 255 

int main(void) 
{ 

    char content[ BUFF_SIZE ]; 

    int fin; 
    int fout; 

    if(0 > (fin = open("test1.mal", O_RDONLY))) 
    { 
     perror("open for read of test1.mal failed"); 
     exit(EXIT_FAILURE); 
    } 

    // implied else, open successful 

    if(0 > (fout = open("output.txt", O_WRONLY))) 
    { 
     perror("open for write of output.txt failed"); 
     close(fin); 
     exit(EXIT_FAILURE); 
    } 

    // implied else, fopen successful 

    printf("files open correct\n"); 

    ssize_t readCount; 
    while(0 < (readCount = read(fin, content, sizeof(content)))) 
    { 
     //fputs(content, stdout); // are you sure the file contents are printable? 
     if(readCount != write(fout, content, (size_t)readCount)) 
     { // then write error occured 
      perror("write of data to output file failed"); 
      close(fin); 
      close(fout); 
      exit(EXIT_FAILURE); 
     } 

     // implied else, write successful 
    } 

    if(0 > readCount) 
    { // then read error occurred 
     perror("read of file failed"); 
     close(fin); 
     close(fout); 
     exit(EXIT_FAILURE); 
    } 

    // implied else, complete file copied 

    printf("file created and text copied\n"); 

    close(fin); 
    close(fout); 
    return 0; 
} // end function: main 
+0

Vous devriez probablement ajouter 'O_CREAT' et' O_TRUNC' et un argument 'mode' à' open ("output.txt", O_WRONLY) '. Peut-être 'open (" output.txt ", O_WRONLY | O_CREAT | O_TRUNC, 0666)'. Oui, je sais - '0666' devrait utiliser des drapeaux de mode au lieu d'un nombre magique ... –

+0

@AndrewHenle, Si je comprends bien, 'O_WRONLY' gérera si le fichier existe déjà et tronquera un fichier existant, donc 'O_TRUNC' n'est pas nécessaire. Je dois avouer que je suis tellement habitué à configurer mon environnement pour donner au propriétaire et au groupe des droits de lecture et d'écriture et de lecture en lecture que je ne pensais même pas à spécifier un paramètre d'autorisation. – user3629249

+0

'O_WRONLY' signifie" ouvert pour l'écriture uniquement ", et seulement ça. Voir http://pubs.opengroup.org/onlinepubs/9699919799/ Sans 'O_CREAT',' open() 'ne créera pas le fichier. Et sans 'O_TRUNC', il ne tronquera pas le fichier. 'open()' n'est pas comme 'fopen()'. 'fopen()' créera ou tronquera implicitement des fichiers en fonction des arguments passés, mais 'open()' n'agit pas de cette façon. Et si 'open()' est passé 'O_CREAT', vous devez passer un paramètre de mode parce que si le fichier est créé,' open() 'utilisera tout ce qu'il trouve où l'argument' mode' devrait être le nouveau fichier autorisations –