|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Feb 2008
Città: Rimini
Messaggi: 481
|
[C] Problema nell'apertura di un file
Ciao a tutti, ho scritto un semplice programma che, preso in ingresso un file di testo, ne restituisce un altro in cui alcune lettere sono scambiate.
I nomi del file di input e di quello di output sono immessi da tastiera, e il problema sta nel fatto che, mentre il file di ingresso viene aperto correttamente, quello in uscita restituisce sempre un errore. la cosa strana è che, se al posto di far inserire all'utente il nome del file lo specifico manualmente come argomento della funzione fopen, tutto funziona correttamente. Grazie in anticipo a chi mi aiuterà! Codice:
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *input;
FILE *output;
char nome_input[20];
char nome_output[20];
unsigned char stringa[2];
unsigned char inverti1, inverti2, inverti3, inverti4;
unsigned char carattere;
printf("GESTIONE DI FILE DI TESTO");
printf("\n\nInserire il nome del file di origine: ");
gets(nome_input);
printf("\nInserire il nome del file di destinazione: ");
gets(nome_output);
printf("\nInserire i due caratteri da invertire: ");
scanf("%s", stringa);
inverti1=stringa[0];
inverti2=stringa[1];
inverti3=inverti1-32;
inverti4=inverti2-32;
if((input=fopen(nome_input, "r"))==NULL)
printf("\n\nErrore nell\'apertura del file di origine\n");
if((output=fopen(nome_output, "w"))==NULL)
printf("\n\nErrore nell\'apertura del file di destinazione\n");
while(!feof(input)) {
carattere=getc(input);
if(carattere==inverti1)
putc(inverti2, output);
else if(carattere==inverti2)
putc(inverti1, output);
else if(carattere==inverti3)
putc(inverti4, output);
else if(carattere==inverti4)
putc(inverti3, output);
else
putc(carattere, output);
}
printf("\nFatto!\n\n");
fclose(input);
fclose(output);
system("pause");
return 0;
}
__________________
MSI GF63 Thin 9SC | Samsung Galaxy S20+ 5G
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Mar 2007
Città: Milano Beach
Messaggi: 1696
|
Errore nel senso che fopen restituisce NULL e quindi tutto muore li?
Hint: fopen in caso di errore imposta la variabile errno in modo che contenga dati relativi all'errore, oltre a restituire NULL. Qua trovi un esempio.
__________________
~ Cthulhu: MacBookPro 13.3" ~ Azathoth: D510MO |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Feb 2008
Città: Rimini
Messaggi: 481
|
Ho provato a usare perror e mi dice Invalid Argument, ma non capisco perchè succede solo con uno dei due file...
__________________
MSI GF63 Thin 9SC | Samsung Galaxy S20+ 5G
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Sep 2005
Città: Torino
Messaggi: 606
|
qual'è l'input che dai al programma?
ps: ti consiglio vivamente di non usare la gets(), visto che non ha nessun controllo sulla lunghezza della stringa.
__________________
"Se proprio dovete piratare un prodotto, preferiamo che sia il nostro piuttosto che quello di qualcun altro." [Jeff Raikes] "Pirating software? Choose Microsoft!" |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Feb 2008
Città: Rimini
Messaggi: 481
|
scrivo rispettivamente testo.txt e output.txt
__________________
MSI GF63 Thin 9SC | Samsung Galaxy S20+ 5G
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Oct 2004
Messaggi: 1945
|
Con quale dei file ti da errore? quello di input o quello di output?
Come usi perror? |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Feb 2008
Città: Rimini
Messaggi: 481
|
mi da errore con il file di output.
ho scritto così: Codice:
if((output=fopen(nome_output, "w"))==NULL) {
perror("\nErrore nell\'apertura del file di destinazione");
}
__________________
MSI GF63 Thin 9SC | Samsung Galaxy S20+ 5G
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Oct 2004
Messaggi: 1945
|
E' un po che non programmo in C comunque fai una prova, magari con un altro file
Fai una cosa del tipo Codice:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#define BSIZE 10
int main(int argn, char ** argv){
char buffer[BSIZE];
printf("Filename: ");
fgets(buffer, BSIZE, stdin);
FILE * fl = fopen(buffer, "r");
if(fl == NULL){
char * err = strerror(errno);
printf("Errore apertura file %s : %s\n", buffer, err);
exit(1);
}
return 0;
}
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Oct 2004
Messaggi: 1945
|
Ehmm una cosa ho dimenticato. Tutto questo tempo lontano dal C me lo ha fatto passare di mente.
Io ho usato fgets, che è molto più sicuro di gets (che tra l'altro è stato anche deprecato). fgets però, al contrario di gets, non sostituisce il newline ( \n ) con il null byte ( \0 ). Per ovviare al problema puoi inserire questa linea subito dopo la richiesta di input Codice:
buffer[strlen(buffer) - 1] = '\0'; |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Feb 2008
Città: Rimini
Messaggi: 481
|
e se usassi scanf con %s come argomento?
__________________
MSI GF63 Thin 9SC | Samsung Galaxy S20+ 5G
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Oct 2004
Messaggi: 1945
|
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Feb 2008
Città: Rimini
Messaggi: 481
|
sì, funziona, però copiando il codice per l'inserimento del nome del file nel mio programma continua a darmi invalid argument...
__________________
MSI GF63 Thin 9SC | Samsung Galaxy S20+ 5G
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Oct 2004
Messaggi: 1945
|
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Feb 2008
Città: Rimini
Messaggi: 481
|
Codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BSIZE 20
int main() {
FILE *input;
FILE *output;
char nome_input[BSIZE];
char buffer[BSIZE];
unsigned char stringa[2];
unsigned char inverti1, inverti2, inverti3, inverti4;
unsigned char carattere;
printf("GESTIONE DI FILE DI TESTO");
printf("\n\nInserire il nome del file di origine: ");
fgets(nome_input, BSIZE, stdin);
nome_input[strlen(nome_input) - 1] = '\0';
printf("\nInserire il nome del file di destinazione: ");
fgets(buffer, BSIZE, stdin);
buffer[strlen(buffer) - 1] = '\0';
printf("\nInserire i due caratteri da invertire: ");
scanf("%s", stringa);
inverti1=stringa[0];
inverti2=stringa[1];
inverti3=inverti1-32;
inverti4=inverti2-32;
if((input=fopen(nome_input, "r"))==NULL) {
perror("\nErrore nell\'apertura del file di origine");
}
if((output=fopen(buffer, "w"))==NULL) {
perror("\nErrore nell\'apertura del file di destinazione");
}
while(!feof(input)) {
carattere=getc(input);
if(carattere==inverti1)
putc(inverti2, output);
else if(carattere==inverti2)
putc(inverti1, output);
else if(carattere==inverti3)
putc(inverti4, output);
else if(carattere==inverti4)
putc(inverti3, output);
else
putc(carattere, output);
}
printf("\nFatto!\n\n");
fclose(input);
fclose(output);
system("pause");
return 0;
}
__________________
MSI GF63 Thin 9SC | Samsung Galaxy S20+ 5G
|
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Feb 2008
Città: Rimini
Messaggi: 481
|
ehm... non so usare un debugger...
__________________
MSI GF63 Thin 9SC | Samsung Galaxy S20+ 5G
|
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Oct 2004
Messaggi: 1945
|
Prova così
Codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#define BSIZE 20
int main() {
FILE *input;
FILE *output;
char nome_input[BSIZE];
char buffer[BSIZE];
unsigned char stringa[2];
unsigned char inverti1, inverti2, inverti3, inverti4;
unsigned char carattere;
printf("GESTIONE DI FILE DI TESTO");
printf("\n\nInserire il nome del file di origine: ");
fgets(nome_input, BSIZE, stdin);
nome_input[strlen(nome_input) - 1] = '\0';
printf("\nInserire il nome del file di destinazione: ");
fgets(buffer, BSIZE, stdin);
buffer[strlen(buffer) - 1] = '\0';
printf("\nInserire i due caratteri da invertire: ");
scanf("%s", stringa);
inverti1=stringa[0];
inverti2=stringa[1];
inverti3=inverti1-32;
inverti4=inverti2-32;
if((input=fopen(nome_input, "r"))==NULL) {
// perror("\nErrore nell\'apertura del file di origine");
printf("Errore apertura %s: %s\n", nome_input, strerror(errno));
exit(1);
}
if((output=fopen(buffer, "w"))==NULL) {
// perror("\nErrore nell\'apertura del file di destinazione");
printf("Errore apertura %s: %s\n", buffer, strerror(errno));
exit(2);
}
while(!feof(input)) {
carattere=getc(input);
if(carattere==inverti1)
putc(inverti2, output);
else if(carattere==inverti2)
putc(inverti1, output);
else if(carattere==inverti3)
putc(inverti4, output);
else if(carattere==inverti4)
putc(inverti3, output);
else
putc(carattere, output);
}
printf("\nFatto!\n\n");
fclose(input);
fclose(output);
system("pause");
return 0;
}
|
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Nov 2013
Città: Nel cuore dell'8 Mile di Detroit
Messaggi: 3968
|
provato a usare fdopen invece di fopen
e provato ad aprire in "w+" o "r+" ?? altra cosa: il nome del file da aprire/aggiornare lo dai relativo o assoluto (cioè che parte dalla radice dell'unità) ? |
|
|
|
|
|
#18 |
|
Member
Iscritto dal: Dec 2013
Messaggi: 90
|
il problema non risiede nel codice,a parte quell'orrendo system.
La prima cosa da fare è disinstallare quella ciofeca di dev-c++ e installare un ide piu serio. Sicuramente usi un windows superiore al xp e quindi se non hai i diritti non puoi scrivere i file dove ti pare e piace ma solo dove hai i diritti. Prova quindi a scrivere come output il percorso completo di una cartella di cui hai i diritti. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 15:51.



















