Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - comando di sistema Windows in un codice c++ mi sapreste dire dove sto sbagliando e come deve essere eventualmente cambiato?
Forum - C/C++ - comando di sistema Windows in un codice c++ mi sapreste dire dove sto sbagliando e come deve essere eventualmente cambiato?

Pagine: [ 1 2 3 ] Precedente | Prossimo
Avatar
musical wrighter (Normal User)
Newbie


Messaggi: 17
Iscritto: 26/09/2018

Segnala al moderatore
Postato alle 11:37
Venerdì, 11/09/2020
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

PM Quote
Avatar
AldoBaldo (Member)
Guru


Messaggi: 699
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 15:43
Venerdì, 11/09/2020
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: https://www.lifewire.com/dir-command-4050018

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

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main() {
  5.     system("dir /b >\"prova.txt\"");
  6.     return 0;
  7. }



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.
PM Quote
Avatar
musical wrighter (Normal User)
Newbie


Messaggi: 17
Iscritto: 26/09/2018

Segnala al moderatore
Postato alle 19:44
Venerdì, 11/09/2020
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:

PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1344
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 20:48
Venerdì, 11/09/2020
Testo quotato

Postato originariamente da AldoBaldo:

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main() {
  5.     system("dir /b >\"prova.txt\"");
  6.     return 0;
  7. }





Se volessi fare la stessa cosa in un percorso scelto?


in programmazione tutto è permesso
PM Quote
Avatar
AldoBaldo (Member)
Guru


Messaggi: 699
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 21:50
Venerdì, 11/09/2020
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...

https://stackoverflow.com/questions/40708652/cannot-change- ...

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

Codice sorgente - presumibilmente C/C++

  1. #include <stdlib.h>
  2.  
  3. int main() {
  4.     system( "cd \"c:\\users\\Cicci\\desktop\" && dir /b >\"prova.txt\"" );
  5.     return 0;
  6. }



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.
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1344
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 23:38
Venerdì, 11/09/2020
Testo quotato

Postato originariamente da AldoBaldo:
Dunque, la soluzione pare poter essere una cosa tipo questa...

Codice sorgente - presumibilmente C/C++

  1. #include <stdlib.h>
  2.  
  3. int main() {
  4.     system( "cd \"c:\\users\\Cicci\\desktop\" && dir /b >\"prova.txt\"" );
  5.     return 0;
  6. }





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 il 11/09/2020 alle 23:54


in programmazione tutto è permesso
PM Quote
Avatar
AldoBaldo (Member)
Guru


Messaggi: 699
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 10:44
Sabato, 12/09/2020
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.

Codice sorgente - presumibilmente C/C++

  1. #include <stdlib.h>
  2.  
  3. int main() {
  4.    
  5.     /* =================================================================**
  6.     ** 1. cambia la cartella, "attivando" quella del desktop            **
  7.     ** 2. crea sul desktop una nuova cartella chiamata "mia cartella"   **
  8.     ** 3. elenca i nomi dei file presenti sul desktop (che e' ancora la **
  9.     **    cartella "attiva", in virtu' del primo comando), specificando **
  10.     **    di volerli collocare nel file "prova.txt" all'interno della   **
  11.     **    cartella "mia cartella" appena creata                         **
  12.     **==================================================================*/
  13.    
  14.     system( "cd \"c:\\users\\Cicci\\desktop\" && \
  15.              mkdir \"mia cartella\" && \
  16.              dir /b >\"mia cartella\\prova.txt\"" );
  17.  
  18.     return 0;
  19. }



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:
https://en.wikipedia.org/wiki/Batch_file

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:

Codice sorgente - presumibilmente Plain Text

  1. cd "c:\users\Cicci\desktop"
  2. mkdir "mia cartella"
  3. dir /b >"mia cartella\prova.txt"


Ultima modifica effettuata da AldoBaldo il 12/09/2020 alle 11: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.
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1344
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 13:50
Sabato, 12/09/2020
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
PM Quote
Avatar
AldoBaldo (Member)
Guru


Messaggi: 699
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 14:55
Sabato, 12/09/2020
Siamo dei fenomeni, dai! :k:


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.
PM Quote
Pagine: [ 1 2 3 ] Precedente | Prossimo