Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [C] Copia File con Buffer.. problema runtime Macintosh

    Salve a tutti. Ho scritto un programma in c per copiare i files chiamato "cp.c", sotto windows funziona egregiamente ma sotto mac (dopo aver compilato ovvio) il file scritto non appariva... perciò ho aggiunto un controllo nel programma c ed effettivamente scrive sul file ma quando viene chiuso non esiste su disco.
    Ho provato anche aggiungendo "sudo" all'inizio del comando ma nulla...
    Come risolvo?

    Questo è il mio output:
    codice:
    MacBook-Pro-di-Tommaso-Ricci:C zorgatone$ ls
    alunni.dat	cp.c		employee.c	file.c		read
    cp		employee	file		prova.dat	read.c
    MacBook-Pro-di-Tommaso-Ricci:C zorgatone$ ./cp file file2
    Starting...
    file->file2
    Pos: 9056
    Error on written file.
    Error during file coping.
    Closing...
    MacBook-Pro-di-Tommaso-Ricci:C zorgatone$
    Questo è il programma:
    Codice PHP:
    // cp.c

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

    #define N 250

    typedef unsigned char BYTE;

    bool filecopia(char *filenamechar *file2);
    bool canopen(char filenamechar *mode);

    int main(int argcchar *argv[]) {

        if(
    argc != || (argc >= && strcmp(argv[1], "--help") == 0) || (argc >= && strcmp(argv[1], "--h") == 0) || (argc >= && strcmp(argv[2], "--help") == 0) || (argc >= && strcmp(argv[2], "--h") == 0)) {
            
    printf("Usage: \"%s source destination\".\n"argv[0]);
            return 
    0;
        }
        if(!
    canopen(argv[1], "rb")) {
            
    fprintf(stderr"Cannot open file 1.\n");
            exit(
    EXIT_FAILURE);
        }
        else if(!
    canopen(argv[2], "wb")) {
            
    fprintf(stderr"Cannot open file 2.\n");
            exit(
    EXIT_FAILURE);
        }
        else {
            
    printf("Starting...\n");
            
            if(
    filecopia(argv[1], argv[2])) {
                
    printf("Success!\n");
                return 
    0;
            }
        }

        
    fprintf(stderr"Error during file coping.\nClosing...\n");
        exit(
    EXIT_FAILURE);

    }

    bool canopen(char filenamechar *mode) {

        
    FILE *fp;
        if(!(
    fp fopen(filenamemode))) {
            return 
    false;
        }
        
    fclose(fp);

        return 
    true;

    }

    bool filecopia(char *filenamechar *file2) {
        
        
    printf("%s->%s\n"filenamefile2);

        
    FILE *f1 fopen(filename"rb"), *f2 fopen(file2"wb");
        
    char buf1[N], buf2[N];
        
    BYTE p;
        
    int pos0;

        if(
    canopen(file2"rb")) {
            
    remove(file2);
        }
        
        if (!
    f1 || !f2) {
            
    fprintf(stderr"Error opening files.\n");
            
    fclose(f1);
            
    fclose(f2);
            return 
    false;
        }

        
    setvbuf(f1buf1_IOFBFN);
        
    setvbuf(f2buf2_IOFBFN);

        
    fseek(f10LSEEK_END);
        
    pos ftell(f1);
        
    printf("Pos: %d\n"pos);
        
    rewind(f1);

        while(
    i++<pos) {
            
    fread(&p11f1);
            
    fwrite(&p11f2);
        }
        
    fclose(f1);
        
    fclose(f2);
        
        if (!
    canopen(file2"rb")) {
            
    fprintf(stderr"Error on written file.\n");
            return 
    false;
        }

        return 
    true;



  2. #2
    Con questo piccolo ritocco ho capito che i files non vengono effettivamente aperti... Ma perchè?? Prima li apre e poi no è assurdo!

    Vi mostro l'output:
    codice:
    MacBook-Pro-di-Tommaso-Ricci:C zorgatone$ gcc cp.c -o cp
    MacBook-Pro-di-Tommaso-Ricci:C zorgatone$ sudo ./cp file file2
    Canopen: file: "rb"
    Canopen: file2: "wb"
    Starting...
    file->file2
    Canopen: file2: "rb"
    Error opening files.
    Error during file coping.
    Closing...
    MacBook-Pro-di-Tommaso-Ricci:C zorgatone$
    Codice PHP:
    // cp.c

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

    #define N 250

    typedef unsigned char BYTE;

    bool filecopia(char *filenamechar *file2);
    bool canopen(char filenamechar *mode);

    int main(int argcchar *argv[]) {

        if(
    argc != || (argc >= && strcmp(argv[1], "--help") == 0) || (argc >= && strcmp(argv[1], "--h") == 0) || (argc >= && strcmp(argv[2], "--help") == 0) || (argc >= && strcmp(argv[2], "--h") == 0)) {
            
    printf("Usage: \"%s source destination\".\n"argv[0]);
            return 
    0;
        }
        if(!
    canopen(argv[1], "rb")) {
            
    fprintf(stderr"Cannot open file 1.\n");
            exit(
    EXIT_FAILURE);
        }
        else if(!
    canopen(argv[2], "wb")) {
            
    fprintf(stderr"Cannot open file 2.\n");
            exit(
    EXIT_FAILURE);
        }
        else {
            
    printf("Starting...\n");
            
            if(
    filecopia(argv[1], argv[2])) {
                
    printf("Success!\n");
                return 
    0;
            }
        }

        
    fprintf(stderr"Error during file coping.\nClosing...\n");
        exit(
    EXIT_FAILURE);

    }

    bool canopen(char filenamechar *mode) {

        
    FILE *fp;
        
    fp fopen(filenamemode);
        if(
    fp== NULL) {
            
    printf("Cannot open: %s: \"%s\"\n"filenamemode);
            return 
    false;
        }
        
    fclose(fp);
        
    printf("Canopen: %s: \"%s\"\n"filenamemode);

        return 
    true;

    }

    bool filecopia(char *filenamechar *file2) {
        
        
    printf("%s->%s\n"filenamefile2);

        
    FILE *f1 , *f2;
        
    char buf1[N], buf2[N];
        
    BYTE p;
        
    int pos0;

        if(
    canopen(file2"rb")) {
            
    remove(file2);
        }
        
        
    f1 fopen(filename"rb");
        
    f2 fopen(file2"rb");
        
        if (
    f1==NULL || f2==NULL) {
            
    fprintf(stderr"Error opening files.\n");
            
    fclose(f1);
            
    fclose(f2);
            return 
    false;
        }

        
    setvbuf(f1buf1_IOFBFN);
        
    setvbuf(f2buf2_IOFBFN);

        
    fseek(f10LSEEK_END);
        
    pos ftell(f1);
        
    printf("Pos: %d\n"pos);
        
    rewind(f1);

        for(
    ftell(f1);i<pos;ftell(f1)) {
            
    printf("Posf1: %d\tPosf2: %d\t"iftell(f2));
            
    fread(&p11f1);
            
    fwrite(&p11f2);
            
    printf("Pos2f1: %d\tPos2f2: %d \n"ftell(f1), ftell(f2));
        }
        
    fclose(f1);
        
    fclose(f2);
        
        if (!
    canopen(file2"rb")) {
            
    fprintf(stderr"Error on written file.\n");
            return 
    false;
        }

        return 
    true;



  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Prova a stampare il valore di errno (includendo errno.h) laddove hai problemi con l'istruzione perror(NULL) o fprintf(stderr, "%s", strerror(errno));

    Comunque così a occhio...

    codice:
        if(canopen(file2, "rb")) {
            remove(file2);
        }
        
        f1 = fopen(filename, "rb");
        f2 = fopen(file2, "rb");
        
        if (f1==NULL || f2==NULL) {
            fprintf(stderr, "Error opening files.\n");
            fclose(f1);
            fclose(f2);
            return false;
        }
    non ne comprendo il senso... verifichi se file2 può essere aperto in lettura binaria; se è possibile, lo elimini (?) dopodiché riapri entrambi i file in lettura... a parte che file2 credo debba essere aperto in modalità wb visto che vuoi scriverci (ma hai scritto rb), è ovvio che se elimini dal FS file2 e poi provi ad aprirlo in lettura avrai un errore, non puoi leggere da un file che non esiste.
    every day above ground is a good one

  4. #4
    Originariamente inviato da YuYevon
    Prova a stampare il valore di errno (includendo errno.h) laddove hai problemi con l'istruzione perror(NULL) o fprintf(stderr, "%s", strerror(errno));

    Comunque così a occhio...

    codice:
        if(canopen(file2, "rb")) {
            remove(file2);
        }
        
        f1 = fopen(filename, "rb");
        f2 = fopen(file2, "rb");
        
        if (f1==NULL || f2==NULL) {
            fprintf(stderr, "Error opening files.\n");
            fclose(f1);
            fclose(f2);
            return false;
        }
    non ne comprendo il senso... verifichi se file2 può essere aperto in lettura binaria; se è possibile, lo elimini (?) dopodiché riapri entrambi i file in lettura... a parte che file2 credo debba essere aperto in modalità wb visto che vuoi scriverci (ma hai scritto rb), è ovvio che se elimini dal FS file2 e poi provi ad aprirlo in lettura avrai un errore, non puoi leggere da un file che non esiste.
    Azz.. No il primo verificava che non esistesse f2, poi sì andava aperto in "wb"...
    Comunque Ho risolto così:
    Codice PHP:
    // cp.c

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

    #define N 250

    typedef unsigned char BYTE;

    bool filecopia(FILE *f1FILE *f2);
    bool canopen(char filenamechar *mode);

    int main(int argcchar *argv[]) {
        
        
    FILE *f1, *f2;

        if(
    argc != || (argc >= && strcmp(argv[1], "--help") == 0) || (argc >= && strcmp(argv[1], "--h") == 0) || (argc >= && strcmp(argv[2], "--help") == 0) || (argc >= && strcmp(argv[2], "--h") == 0)) {
            
    printf("Usage: \"%s source destination\".\n"argv[0]);
            return 
    0;
        }
        if(!
    canopen(argv[1], "rb")) {
            
    fprintf(stderr"Cannot open file 1.\n");
            exit(
    EXIT_FAILURE);
        }
        else if(!
    canopen(argv[2], "wb")) {
            
    fprintf(stderr"Cannot open file 2.\n");
            exit(
    EXIT_FAILURE);
        }
        else {
            
    printf("Starting...\n");
            
    f1 fopen(argv[1], "rb");
            
    f2 fopen(argv[2], "wb");
            
            if(
    filecopia(f1,f2)) {
                if (!
    canopen(argv[2], "rb")) {
                    
    fprintf(stderr"Error on written file.\n");
                    return 
    false;
                }
                
    printf("Success!\n");
                return 
    0;
            }
        }

        
    fprintf(stderr"Error during file coping.\nClosing...\n");
        exit(
    EXIT_FAILURE);

    }

    bool canopen(char filenamechar *mode) {

        
    FILE *fp;
        
    fp fopen(filenamemode);
        if(
    fp== NULL) {
            
    printf("Cannot open: %s: \"%s\"\n"filenamemode);
            return 
    false;
        }
        
    fclose(fp);
        
    printf("Canopen: %s: \"%s\"\n"filenamemode);

        return 
    true;

    }

    bool filecopia(FILE *f1FILE *f2) {
        
        
    char buf1[N], buf2[N];
        
    BYTE p;
        
    int pos0;
        
        if (
    f1==NULL || f2==NULL) {
            
    fprintf(stderr"Error opening files.\n");
            
    fclose(f1);
            
    fclose(f2);
            return 
    false;
        }

        
    setvbuf(f1buf1_IOFBFN);
        
    setvbuf(f2buf2_IOFBFN);

        
    fseek(f10LSEEK_END);
        
    pos ftell(f1);
        
    printf("Pos: %d\n"pos);
        
    rewind(f1);

        for(
    ftell(f1);i<pos;ftell(f1)) {
            
    printf("Posf1: %d\tPosf2: %d\t"iftell(f2));
            
    fread(&p11f1);
            
    fwrite(&p11f2);
            
    printf("Pos2f1: %d\tPos2f2: %d \n"ftell(f1), ftell(f2));
        }
        
    fclose(f1);
        
    fclose(f2);

        return 
    true;



Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.