Oppure

Loading
11/09/20 9:37
musical wrighter
Ciao a tutti, sto tentando di costruire una piccola app in ambiente Windows che dovrebbe raccogliere in un file di testo i nomi di tutti i file e le sottocartelle contenute nella directory in cui si trova l'eseguibile al momento dell'avvio. Quindi compreso se stesso e il file di testo. Poi una volta effettuata quest'operazione dovrebbe proseguire e fare anche altro ma dal momento che la riscrittura dei nomi dei file e delle sottocartelle già non funziona resto bloccato a questo punto ed è inutile aggiungere il resto. In pratica compila correttamente, e l'eseguibile quando ci clicco un file chiamato "appunti.txt" lo crea anche. Ma quando vado ad aprirlo col blocco note è completamente bianco. Dal txt mi aspettavo di leggere un nome di file per riga tipo
appunti.txt
lista.exe
eccetera. In questo caso tutti gli elementi presenti nella cartella release del mio progetto che si chiama lista. Dopo di che avrei completato il codice includendo anche le librerie fstream e string, il file "appunti.txt" doveva diventare un ifstream e il contenuto valori di stringhe letti tramite getline(appunti,nome_della_stringa);. Ma se mi sputa fuori un file completamente vuoto nulla di tutto questo si può fare.
Il codice che fin ora ho scritto è il seguente
#include <iostream>
using namespace std;
int main()
{
    system("ls -name >appunti.txt";);
}
Questa è la prima volta che uso un comando di sistema in c++ apparte pause. E chiedo sostanzialmente se sbaglio qualcosa nel riadattare la sintassi da riga di comando al linguaggio. Il simbolo di maggiore è interpretato correttamente perché crea un file di tipo testuale dandogli come nome il testo che si trova tra il maggiore e le chiuse virgolette. Mentre i comandi ls a quanto pare vanno scritti diversamente. Qualcuno mi sa dire quindi come? Grazie e buona giornata a tutti
Sto lavorando su un Windows 10 con Visualstudio2019. Ho provato a fare la stessa cosa anche con Visualstudio 2017 con le due apposite aggiunte necessarie perché compili in quest'ultimo ambiente ma il risultato è identico
aaa
11/09/20 13:43
AldoBaldo
Tornando con la memoria ai vecchi tempi in cui caricavo videogiochi in DOS da floppy disk sul PC con processore 286 di mio fratello, m'è sovvenuto il comando "dir", che ho cercato e trovato: lifewire.com/…

Con system("dir /b >\"prova.txt\"";); son riuscito a ottenere quel che credo d'aver capito sia il tuo obiettivo.

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

int main() {
    system("dir /b >\"prova.txt\"");
    return 0;
}


Questa roba qui crea un file "prova.txt" che contiene un elenco che nel mio caso è...

bin
main.c
obj
prova.txt
sdfsdf.cbp
sdfsdf.depend

...dove bin e obj sono due cartelle, e i rimanenti sono file che fanno capo a un progetto dell'IDE che uso, Code::Blocks.

Leggi la documentazione, provalo e dimmi se fa al caso tuo.

Ah, importante: leggi cosa c'è scritto nella firma, qui sotto.
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
11/09/20 17:44
musical wrighter
Mille grazie invece, perché ora funziona a meraviglia! Ho sostituito la riga con ls con quella che mi hai suggerito con dir e il risultato è stato perfetto. tranquillo che allora siamo nella stessa barca. io sono al tempo stesso studente e dilettante. in attesa di acquisire abbastanza conoscenza di programmazione per farlo diventare anche un lavoro. se ti riservisse le librerie stdio e stdlib non servono ai fini di questa semplice operazione. occorre solo specificare il namespace std che per comodità indico sempre con using nelle prime righe per non doverlo ripetere più volte. Probabilmente nell'esempio che hai trovato servivano per altre funzioni che il programma doveva avere. son contento d'averti ricordato un momento nostalgico :heehee:. vuoi dire che ho un modo ajé di programmare? pensa che sono degli anni 90. in che anni avevi quei videogames? Probabilmente ora con gli aggiornamenti dei linguaggi si complicano la vita :heehee: :heehee:
aaa
11/09/20 18:48
Carlo
Postato originariamente da AldoBaldo:

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

int main() {
    system("dir /b >\"prova.txt\"");
    return 0;
}



Se volessi fare la stessa cosa in un percorso scelto?
in programmazione tutto è permesso
11/09/20 19:50
AldoBaldo
musical wrighter, sono veramente contento d'esserti stato utile. In un contesto, spero, di umiltà e scambio reciproco di... aiutini. :)

Per quanto riguarda gli include, l'esempio che ti ho proposto è in C, non in C++, anche se a quel livello di semplicità è irrilevante. Nel contesto di quel programma di due righe, in effetti, stdio.h non è necessario, mentre stdlib.h è l'include indispensabile per avere accesso alla funzione system(). I namespace sono una caratteristica di C++, linguaggio che uso di quando in quando ma solo limitatamente alle sue caratteristiche più "di base".

Gli anni ai quali facevo cenno si collocano tra il 1990 e il 1994, a occhio e croce. Ormai sono archeologia, anche se per me (come potrai immaginare) significano molto perché fanno parte della mia storia di vita.

Carlo, bella domanda alla quale assolutamente non avrei saputo cosa rispondere.
Stimolato dal tuo interrogativo, ho fatto una "ricerchina" e ho trovato questo...

stackoverflow.com/questions/40708652/…

Dunque, la soluzione pare poter essere una cosa tipo questa...

#include <stdlib.h>

int main() {
    system( "cd \"c:\users\Cicci\desktop\" && dir /b >\"prova.txt\"" );
    return 0;
}


Nel caso specifico, avendo io un utente registrato come "Cicci", con quel programma elenco i file e le cartelle presenti sul desktop di "Cicci".
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
11/09/20 21:38
Carlo
Postato originariamente da AldoBaldo:
Dunque, la soluzione pare poter essere una cosa tipo questa...

#include <stdlib.h>

int main() {
    system( "cd \"c:\users\Cicci\desktop\" && dir /b >\"prova.txt\"" );
    return 0;
}



Sai che non mastico di C, ma quando ho visto la domanda sul system, mi son detto: "non so rispondere, ma sono comandi DOS"

allora ho scritto:

printf("%d.\n", system("dir";)); // funziona

per saggiare:

printf("%d.\n", system("dir C:";)); // non funziona

ora so che dovevo scrivere:

printf("%d.\n", system("dir C:\";)); // funziona e è anche logico.

Invece la logica della sintassi per salvare il file mi sfugge, anche se funziona.

system("dir C:\ /b >\"prova2.txt\"";);

Grazie per aver assecondato le mie curiosità, anche se non rivolte ad imparare il C.
Ultima modifica effettuata da Carlo 11/09/20 21:54
in programmazione tutto è permesso
12/09/20 8:44
AldoBaldo
Devo ribadire che è un argomento che non conosco, infatti ho dovuto cercare le soluzioni.

Per quanto riguarda il comando che ho usato, da quel che ho capito...

"dir" identifica il tipo di comando
"/b" e' un attributo del comando, che specifica che si vogliono solo i nomi dei file e niente altro
">" (che ho copiato pari pari da musical wrighter) DOVREBBE ESSERE un modo per dire al comando che vuoi l'output in qualche posto che non è la console
\"prova2.txt\" è la collocazione, che scritta così indica un file nella cartella corrente

Per verificarlo, ho provato con quest'altra stringa di comando, e ha funzionato. Quindi il ragionamento dovrebbe reggere.

#include <stdlib.h>

int main() {
    
    /* =================================================================**
    ** 1. cambia la cartella, "attivando" quella del desktop            **
    ** 2. crea sul desktop una nuova cartella chiamata "mia cartella"   **
    ** 3. elenca i nomi dei file presenti sul desktop (che e' ancora la **
    **    cartella "attiva", in virtu' del primo comando), specificando **
    **    di volerli collocare nel file "prova.txt" all'interno della   **
    **    cartella "mia cartella" appena creata                         **
    **==================================================================*/
    
    system( "cd \"c:\users\Cicci\desktop\" && \
             mkdir \"mia cartella\" && \
             dir /b >\"mia cartella\prova.txt\"" );

    return 0;
}


Credo che per approfondire l'argomento occorra occuparsi, più che di C o C++ in senso stretto, del modo in cui si mette insieme un file .bat , ma non ho alcuna certezza in merito.

Per i curiosi:
en.wikipedia.org/wiki/…

EDIT
Infatti, prendendo il comando system() di prima e scrivendolo in un file "prova.bat" in questa forma, si ottiene lo stesso identico risultato ottenuto col programma in C:

cd "c:\users\Cicci\desktop"
mkdir "mia cartella"
dir /b >"mia cartella\prova.txt"
Ultima modifica effettuata da AldoBaldo 12/09/20 9:18
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
12/09/20 11:50
Carlo
Concordo è DOS puro, e una volta capito come concatenare i comadi, sembra che si possa scrivere un file batch DOS completo.
in programmazione tutto è permesso