Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Tastiera gaming MSI GK600 TKL: switch hot-swap, display LCD e tre modalità wireless
Tastiera gaming MSI GK600 TKL: switch hot-swap, display LCD e tre modalità wireless
MSI FORGE GK600 TKL WIRELESS: switch lineari hot-swap, tripla connettività, display LCD e 5 strati di fonoassorbimento. Ottima in gaming, a 79,99 euro
DJI Osmo Pocket 4: la gimbal camera tascabile cresce e ha nuovi controlli fisici
DJI Osmo Pocket 4: la gimbal camera tascabile cresce e ha nuovi controlli fisici
DJI porta un importante aggiornamento alla sua linea di gimbal camera tascabili con Osmo Pocket 4: sensore CMOS da 1 pollice rinnovato, gamma dinamica a 14 stop, profilo colore D-Log a 10 bit, slow motion a 4K/240fps e 107 GB di archiviazione integrata. Un prodotto pensato per i creator avanzati, ma che convince anche per l'uso quotidiano
Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori
Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori
Il primo headset open-back della linea INZONE arriva a 200 euro con driver derivati dalle cuffie da studio MDR-MV1 e un peso record di soli 199 grammi
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 19-12-2013, 16:12   #1
gscaparrotti
Senior Member
 
L'Avatar di gscaparrotti
 
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
gscaparrotti è offline   Rispondi citando il messaggio o parte di esso
Old 19-12-2013, 16:27   #2
GByTe87
Senior Member
 
L'Avatar di GByTe87
 
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
GByTe87 è offline   Rispondi citando il messaggio o parte di esso
Old 20-12-2013, 08:23   #3
gscaparrotti
Senior Member
 
L'Avatar di gscaparrotti
 
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
gscaparrotti è offline   Rispondi citando il messaggio o parte di esso
Old 20-12-2013, 09:01   #4
Oceans11
Senior Member
 
L'Avatar di Oceans11
 
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!"
Oceans11 è offline   Rispondi citando il messaggio o parte di esso
Old 20-12-2013, 09:11   #5
gscaparrotti
Senior Member
 
L'Avatar di gscaparrotti
 
Iscritto dal: Feb 2008
Città: Rimini
Messaggi: 481
scrivo rispettivamente testo.txt e output.txt
__________________
MSI GF63 Thin 9SC | Samsung Galaxy S20+ 5G
gscaparrotti è offline   Rispondi citando il messaggio o parte di esso
Old 20-12-2013, 10:12   #6
clockover
Senior Member
 
L'Avatar di clockover
 
Iscritto dal: Oct 2004
Messaggi: 1945
Con quale dei file ti da errore? quello di input o quello di output?
Come usi perror?
clockover è offline   Rispondi citando il messaggio o parte di esso
Old 20-12-2013, 10:40   #7
gscaparrotti
Senior Member
 
L'Avatar di gscaparrotti
 
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
gscaparrotti è offline   Rispondi citando il messaggio o parte di esso
Old 20-12-2013, 11:09   #8
clockover
Senior Member
 
L'Avatar di clockover
 
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;
}
Fai una prova con questo e dopo fai una prova cambiando da "r" a "w" e riporta gli errori.
clockover è offline   Rispondi citando il messaggio o parte di esso
Old 20-12-2013, 11:22   #9
clockover
Senior Member
 
L'Avatar di clockover
 
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';
Ciao
clockover è offline   Rispondi citando il messaggio o parte di esso
Old 20-12-2013, 11:24   #10
gscaparrotti
Senior Member
 
L'Avatar di gscaparrotti
 
Iscritto dal: Feb 2008
Città: Rimini
Messaggi: 481
e se usassi scanf con %s come argomento?
__________________
MSI GF63 Thin 9SC | Samsung Galaxy S20+ 5G
gscaparrotti è offline   Rispondi citando il messaggio o parte di esso
Old 20-12-2013, 11:29   #11
clockover
Senior Member
 
L'Avatar di clockover
 
Iscritto dal: Oct 2004
Messaggi: 1945
Quote:
Originariamente inviato da gscaparrotti Guarda i messaggi
e se usassi scanf con %s come argomento?
Per te ora il problema non è usare scanf o fgets o gets, il problema è capire perchè l'apertura del file fallisce. Hai provato il mio codice con l'aggiunta? Funziona?
clockover è offline   Rispondi citando il messaggio o parte di esso
Old 20-12-2013, 11:36   #12
gscaparrotti
Senior Member
 
L'Avatar di gscaparrotti
 
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
gscaparrotti è offline   Rispondi citando il messaggio o parte di esso
Old 20-12-2013, 11:37   #13
clockover
Senior Member
 
L'Avatar di clockover
 
Iscritto dal: Oct 2004
Messaggi: 1945
Quote:
Originariamente inviato da gscaparrotti Guarda i messaggi
sì, funziona, però copiando il codice per l'inserimento del nome del file nel mio programma continua a darmi invalid argument...
Mostraci ora il tuo codice modificato
clockover è offline   Rispondi citando il messaggio o parte di esso
Old 20-12-2013, 11:40   #14
gscaparrotti
Senior Member
 
L'Avatar di gscaparrotti
 
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
gscaparrotti è offline   Rispondi citando il messaggio o parte di esso
Old 20-12-2013, 11:48   #15
gscaparrotti
Senior Member
 
L'Avatar di gscaparrotti
 
Iscritto dal: Feb 2008
Città: Rimini
Messaggi: 481
ehm... non so usare un debugger...
__________________
MSI GF63 Thin 9SC | Samsung Galaxy S20+ 5G
gscaparrotti è offline   Rispondi citando il messaggio o parte di esso
Old 20-12-2013, 11:53   #16
clockover
Senior Member
 
L'Avatar di clockover
 
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;
}
clockover è offline   Rispondi citando il messaggio o parte di esso
Old 20-12-2013, 14:19   #17
bancodeipugni
Senior Member
 
L'Avatar di bancodeipugni
 
Iscritto dal: Nov 2013
Città: Nel cuore dell'8 Mile di Detroit
Messaggi: 3974
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à) ?
bancodeipugni è offline   Rispondi citando il messaggio o parte di esso
Old 24-12-2013, 06:27   #18
vbextreme
Member
 
L'Avatar di vbextreme
 
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.
__________________
Easy framework per il linguaggio C.
vbextreme hack your life
vbextreme è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Tastiera gaming MSI GK600 TKL: switch hot-swap, display LCD e tre modalità wireless Tastiera gaming MSI GK600 TKL: switch hot-swap, ...
DJI Osmo Pocket 4: la gimbal camera tascabile cresce e ha nuovi controlli fisici DJI Osmo Pocket 4: la gimbal camera tascabile cr...
Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori Sony INZONE H6 Air: il primo headset open-back d...
Nutanix cambia pelle: dall’iperconvergenza alla piattaforma full stack per cloud ibrido e IA Nutanix cambia pelle: dall’iperconvergenza alla ...
Recensione Xiaomi Pad 8 Pro: potenza bruta e HyperOS 3 per sfidare la fascia alta Recensione Xiaomi Pad 8 Pro: potenza bruta e Hyp...
Voyager Technologies ha siglato un accor...
GoPro annuncia la linea MISSION 1 con tr...
Alcune varianti dei futuri Samsung Galax...
Il ridimensionamento di OnePlus in Europ...
Il cofondatore di Netflix ha lasciato l'...
ASUS porta in Italia il nuovo Zenbook Du...
Assassin's Creed: Black Flag Resynced, s...
Xbox Game Pass cambierà: tra le n...
I nuovi Surface Pro e Laptop sono vicini...
OnePlus ci riprova con la fascia bassa: ...
La Top 10 delle offerte Amazon del weeke...
XGIMI MoGo 2 Pro a 339€: Google TV con N...
Forum IT & Intelligence 2026: dall'A...
iPhone 16e per la prima volta a meno di ...
Stop Killing Games: Ross Scott convince ...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 21:48.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v