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? - Pagina 3

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


Messaggi: 17
Iscritto: 26/09/2018

Segnala al moderatore
Postato alle 16:38
Mercoledì, 23/06/2021
Buon giorno a tutti, eccomi nuovamente quì. Dal momento che quì su questo forum è stata da poco lanciata un'altra discussione molto simile per l'argomento a questa mia dell'anno scorso come scrivo anche li ho colto l'occasione per riprendere anch'io in mano il progetto di cui parlo quì dell'audio player parlante per provare a riscriverlo in maniera un po diversa seguendo anche i suggerimenti arrivati nell'altra discussione. usando tanto per cominciare i metodi FindFirstFile e FindNextFile per ricercare nella cartella invece di system(dir) per creare un file di testo da rileggere. Dunque il codice diventa così
Codice sorgente - presumibilmente C++

  1. #include <iostream>
  2. #include <string>
  3. #include <Windows.h>
  4. #include <sapi.h>
  5. #include <vector>
  6. using namespace std;
  7. #pragma comment(lib,"winmm.lib")
  8. ISpVoice* pVoice;
  9. HRESULT hr;
  10. // una funzione per far comunicare l'applicazione con lutente sia tramite video sia col riscontro vocale
  11. void output(wstring esempio)
  12. {
  13.         wcout << esempio; hr = pVoice->Speak(esempio.c_str(), 0, NULL);
  14. }
  15. int main()
  16. {
  17. //in caso ci fossero file audio con caratteri accentati nei nomi, perché siano riconosciuti correttamente
  18. system("chcp.com 1252");
  19. wstring nome;
  20. vector<wstring>audio;
  21.         pVoice = NULL;
  22.         if (FAILED(::CoInitialize(NULL)))
  23.         {
  24.                 cout << "Non è stato possibile attivare lo speaker su questo computer. Per tanto l'applicazione non è in grado di proseguire. Prego, verifica sull'hard disk la disponibilità del motore di sintesi vocale Sapi prima di avviare nuovamente l'eseguibile" << endl;
  25. system("set /p asd=Premi nuovamente invio per uscire");
  26.                 return FALSE;
  27.         }
  28.         hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void**)&pVoice);
  29.         if (SUCCEEDED(hr))
  30.         {
  31.                 WIN32_FIND_DATA FindFileData;
  32.                 HANDLE hFind;
  33.                 hFind = FindFirstFile(L"\*.*", &FindFileData);
  34.                 while (FindNextFile(hFind, &FindFileData))
  35. {
  36. //dovrebbe servire a scorrere i nomi di tutti i file presenti, ma memorizzare solo gli audio wav
  37. nome = FindFileData.cFileName;
  38.                         if (nome.substr(nome.size() - 4, nome.size()) == L".wav") { audio.push_back(nome);}
  39.                 }
  40. FindClose(hFind);
  41. output(L"Ben venuto! Abbiamo trovato " + to_wstring(audio.size()) + L" brani! Buon ascolto");
  42. cout << endl;
  43.                 for (wstring brano : audio)
  44. {
  45. output(brano.substr(0, brano.size() - 4));
  46. PlaySound(brano.c_str(), NULL, SND_FILENAME);
  47. cout << endl;
  48. }
  49. output(L"Arrivederci");
  50.         }
  51.         pVoice->Release();
  52.         pVoice = NULL;
  53.         ::CoUninitialize();
  54. }


Quello che intendevo far fare all'eseguibile era dare il benvenuto all'utente e comunicare quanti audio erano presenti, dopo di che procedere direttamente ad intrattenere con un po di musica. Annunciando ogni volta il nome dell'audio e riproducendolo fino al termine. Arrivato all'ultimo wav presente in fine salutare e chiudersi. In Visualstudio dalla versione 2019 nel main è già inserito di default return 0 anche senza che si legga nel codice c++ credo. Quello che però fa quando provo ad avviare il file.exe è aprirsi, darmi conferma a video d'aver cambiato la codifica per riconoscere gli accenti e richiudersi immediatamente dopo. In pratica la prima riga nel main sembra la sola istruzione che interpreta ed esegue correttamente. Ma non è quella a bloccare tutto il resto perché ho anche provato a commentarla e a premurarmi d'inserire nella cartella wav senza accentate. In quel caso l'eseguibile rimane aperto per un paio di secondi, non fa assolutamente nulla e si richiude. Qualcuno ha idea di dove sto sbagliando? grazie e buona giornata a tutti

Ultima modifica effettuata da musical wrighter il 23/06/2021 alle 19:35
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6406
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 12:29
Mercoledì, 30/06/2021
La ricerca che hai fatto (prendendo tutti i file e controllando, male fra l'altro, l'estensione) non ha senso.

Fai selezionare al sistema operativo direttamente i file che ti servono

Codice sorgente - presumibilmente C/C++

  1. hFind = FindFirstFile(L"\\*.wav", &FindFileData);
  2.                 while (FindNextFile(hFind, &FindFileData))
  3.                 {
  4.                         nome = FindFileData.cFileName;
  5.                         audio.push_back(nome);
  6.                 }



E dopo controlla di aver ottenuto almeno un file prima di continuare con il "benvenuto"


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Pagine: [ 1 2 3 ] Precedente | Prossimo