PDA

Visualizza la versione completa : [C] Copia file con buffer: problema su Macintosh


Zorgatone
08-05-2011, 17:23
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:

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:

// cp.c

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

#define N 250

typedef unsigned char BYTE;

bool filecopia(char *filename, char *file2);
bool canopen(char * filename, char *mode);

int main(int argc, char *argv[]) {

if(argc != 3 || (argc >= 2 && strcmp(argv[1], "--help") == 0) || (argc >= 2 && strcmp(argv[1], "--h") == 0) || (argc >= 3 && strcmp(argv[2], "--help") == 0) || (argc >= 3 && 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 * filename, char *mode) {

FILE *fp;
if(!(fp = fopen(filename, mode))) {
return false;
}
fclose(fp);

return true;

}

bool filecopia(char *filename, char *file2) {

printf("%s->%s\n", filename, file2);

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

if(canopen(file2, "rb")) {
remove(file2);
}

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

setvbuf(f1, buf1, _IOFBF, N);
setvbuf(f2, buf2, _IOFBF, N);

fseek(f1, 0L, SEEK_END);
pos = ftell(f1);
printf("Pos: %d\n", pos);
rewind(f1);

while(i++<pos) {
fread(&p, 1, 1, f1);
fwrite(&p, 1, 1, f2);
}
fclose(f1);
fclose(f2);

if (!canopen(file2, "rb")) {
fprintf(stderr, "Error on written file.\n");
return false;
}

return true;

}

Zorgatone
08-05-2011, 18:00
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:
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$


// cp.c

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

#define N 250

typedef unsigned char BYTE;

bool filecopia(char *filename, char *file2);
bool canopen(char * filename, char *mode);

int main(int argc, char *argv[]) {

if(argc != 3 || (argc >= 2 && strcmp(argv[1], "--help") == 0) || (argc >= 2 && strcmp(argv[1], "--h") == 0) || (argc >= 3 && strcmp(argv[2], "--help") == 0) || (argc >= 3 && 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 * filename, char *mode) {

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

return true;

}

bool filecopia(char *filename, char *file2) {

printf("%s->%s\n", filename, file2);

FILE *f1 , *f2;
char buf1[N], buf2[N];
BYTE p;
int pos, i = 0;

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(f1, buf1, _IOFBF, N);
setvbuf(f2, buf2, _IOFBF, N);

fseek(f1, 0L, SEEK_END);
pos = ftell(f1);
printf("Pos: %d\n", pos);
rewind(f1);

for(i = ftell(f1);i<pos;i = ftell(f1)) {
printf("Posf1: %d\tPosf2: %d\t", i, ftell(f2));
fread(&p, 1, 1, f1);
fwrite(&p, 1, 1, f2);
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;

}

YuYevon
08-05-2011, 18:24
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...



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.

Zorgatone
08-05-2011, 18:27
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...



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ì:

// cp.c

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

#define N 250

typedef unsigned char BYTE;

bool filecopia(FILE *f1, FILE *f2);
bool canopen(char * filename, char *mode);

int main(int argc, char *argv[]) {

FILE *f1, *f2;

if(argc != 3 || (argc >= 2 && strcmp(argv[1], "--help") == 0) || (argc >= 2 && strcmp(argv[1], "--h") == 0) || (argc >= 3 && strcmp(argv[2], "--help") == 0) || (argc >= 3 && 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 * filename, char *mode) {

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

return true;

}

bool filecopia(FILE *f1, FILE *f2) {

char buf1[N], buf2[N];
BYTE p;
int pos, i = 0;

if (f1==NULL || f2==NULL) {
fprintf(stderr, "Error opening files.\n");
fclose(f1);
fclose(f2);
return false;
}

setvbuf(f1, buf1, _IOFBF, N);
setvbuf(f2, buf2, _IOFBF, N);

fseek(f1, 0L, SEEK_END);
pos = ftell(f1);
printf("Pos: %d\n", pos);
rewind(f1);

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

return true;

}

Loading