Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Ecovacs Deebot X12 OmniCyclone: lava grazie a FocusJet
Ecovacs Deebot X12 OmniCyclone: lava grazie a FocusJet
Il nuovo Deebot X12 OmniCyclone abbina un sistema di raccolta dello sporco senza sacchetto, un rullo di lavaggio esteso e la tecnologia FocusJet per intervenire più efficacemente sulle macchie più persistenti. Un robot completo e preciso che aiuta a tenere puliti i pavimenti di casa con il minimo sforzo
Narwal Flow 2: la pulizia di casa con un mocio a nastro
Narwal Flow 2: la pulizia di casa con un mocio a nastro
Narwal Flow 2 implementa un mocio a nastro che esegue una pulizia dettagliata del pavimento di casa, in abbinamento ad un potente motore di aspirazione della polvere: un prodotto ideale per gestire in autonomia e con grande efficacia le necessità di pulizia dei pavimenti di casa
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
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


Ecovacs Deebot X12 OmniCyclone: lava grazie a FocusJet Ecovacs Deebot X12 OmniCyclone: lava grazie a Fo...
Narwal Flow 2: la pulizia di casa con un mocio a nastro Narwal Flow 2: la pulizia di casa con un mocio a...
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...
Samsung ed Sk hynix, i bonus per gli ope...
Windows 11 velocizza Esplora File: ecco ...
Funzioni nascoste nelle librerie ADLX Ra...
Itala rinasce: lo storico marchio automo...
Huawei Watch Fit 5 e 5 Pro ufficiali: di...
ECOVACS DEEBOT T90 PRO OMNI vs Roborock ...
Fastweb scompare dai partner Starlink Mo...
Huawei anticipa tutti con Pura X Max: il...
Amazon Tech Week 2026: RTX 5000, process...
Grandi offerte Amazon su scope elettrich...
Amazon e Anthropic rafforzano la partner...
Elden Ring: il film arriverà fra ...
Mercato PC, +3,2% nel Q1 2026: Lenovo se...
Corsair Platform: scrivanie gaming modul...
Assassin's Creed Black Flag Resynced: Ub...
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: 13:03.


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