Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Le soluzioni FSP per il 2026: potenza e IA al centro
Le soluzioni FSP per il 2026: potenza e IA al centro
In occasione del Tech Tour 2025 della European Hardware Association abbiamo incontrato a Taiwan FSP, azienda impegnata nella produzione di alimentatori, chassis e soluzioni di raffreddamento tanto per clienti OEM come a proprio marchio. Potenze sempre più elevate negli alimentatori per far fronte alle necessità delle elaborazioni di intelligenza artificiale.
AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa
AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa
AWS è il principale operatore di servizi cloud al mondo e da tempo parla delle misure che mette in atto per garantire una maggiore sovranità alle organizzazioni europee. L'azienda ha ora lanciato AWS European Sovereign Cloud, una soluzione specificamente progettata per essere separata e distinta dal cloud "normale" e offrire maggiori tutele e garanzie di sovranità
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto
Xiaomi ha portato sul mercato internazionale la nuova serie Redmi Note, che rappresenta spesso una delle migliori scelte per chi non vuole spendere molto. Il modello 15 Pro+ punta tutto su una batteria capiente e su un ampio display luminoso, sacrificando qualcosa in termini di potenza bruta e velocità di ricarica
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 19-12-2013, 17: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, 17: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, 09: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, 10: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, 10: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, 11: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, 11: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, 12: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, 12: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, 12: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, 12: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, 12: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, 12: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, 12: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, 12: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, 12: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, 15:19   #17
bancodeipugni
Senior Member
 
L'Avatar di bancodeipugni
 
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à) ?
bancodeipugni è offline   Rispondi citando il messaggio o parte di esso
Old 24-12-2013, 07: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


Le soluzioni FSP per il 2026: potenza e IA al centro Le soluzioni FSP per il 2026: potenza e IA al ce...
AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa AWS annuncia European Sovereign Cloud, il cloud ...
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto Redmi Note 15 Pro+ 5G: autonomia monstre e displ...
HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione HONOR Magic 8 Pro: ecco il primo TOP del 2026! L...
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata Insta360 Link 2 Pro e 2C Pro: le webcam 4K che t...
Netatmo aggiorna riscaldamento e sicurez...
Netflix punterà sempre più...
Un futuro pieno di schifezze fatte dall'...
CATL svela la batteria al sodio che pu&o...
Apple è in difficoltà con ...
Apple starebbe lavorando ad un 'Pin inte...
Sedie da ufficio di qualità a prezzi bas...
Mercedes-AMG svela la nuova F1: conferma...
Europa: nel 2025 le principali fonti di ...
Outlook inutilizzabile su Windows 11: Mi...
Acer Predator Helios 18 AI, un portatile...
FUJIFILM X half, 150 euro di cashback at...
YouTube punta sull'intelligenza artifici...
Volvo presenta una super EX60, e c'&egra...
God of War: Max Parker entra nel cast de...
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: 12:23.


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