Newsgroup: it.comp.lang.c
Titolo: Ignorante in materia....perché non funziona?

devo scrivere in un file "outscan.txt" ciò che mi viene fuori da 
"system(scan)"
#include <stdio.h>
#include <stdlib.h>
FILE *outscan;
char* c;
char* pulisci = "clear";
char* scan = "find /root -iname \"*.mp3\"";
int main(int argc, char* argv[]) {
         system(pulisci);
         c = gets(system(scan));
         outscan = fopen("outscan.txt","w");
         fprintf(outscan, "%s", c);
         fclose(outscan);
return(0);
}


Hai commesso svariati gravi errori.
Forse ti converrebbe leggerti prima un manuale di C.
Per esempio usi l'array c senza allocarlo.
Usi la gets in modo completamente errato.
Se quello che volevi ottenere era di mandare l'output della find
nel file outscan.txt allora tanto valeva fare
direttamente
system("find ./root .....   > outscan.txt");
senza complicarti la vita.
ciao,
g.

 
Vuoi dirmi che con system posso lanciare qualsiasi comando di linux???
Se si ho perso una giornata dietro a sta' cosa!
Grazie mille....
Michele

 
Ho perso una giornata!
#include <stdio.h>
#include <stdlib.h>
int main(void) {
         system("find /root -iname \"*.mp3\" > outscan.txt");
return(0);
}



a questo punto non capisco perche' semplicemente quel comando
non lo metti in un file batch e ti dimentichi completamente
del C ....
g.

 
Purtroppo non posso, devo fare un esame ed è richiesto un programma in 
Ansi C!
Lo sto studiando giorno e notte ma ho ancora molti intoppi....fra una 
settimana ho l'esame e sono arrivato ai modelli di esecuzione a 
pila...non li ho mai sentiti nominare!:-(
Dammi un cosiglio!
Voglio realizzare un programma che mi presenta un menu, con:
- Scan file mp3
- Leggi la lista del genere
- Crea la playlist
- Scafile, l'ho risolto!
- Leggi la lista, ho una lista da stampare a video tipo:
0 = Blues
1 = Classic Rock
2 = Country
3 = Dance
4 = Disco
5 = Funk
6 = Grunge
7 = Hip-Hop
8 = Jazz
9 = Metal
10 = New Age
....
- Crea la Playlist, mi deve ricercare in tutti i brani scansiti 
(outscan.txt) il tag id3 relativo al genere e da qui creare una playlist 
es: jazz.pla.
Sono riuscito a leggere il tag id3, adesso devo crearmi un ciclo.
Il programma deve chiedermi il genere (li ho visti prima), se digito 
Jazz so che è il n° 8, e impostarlo come flag
Che ne dici??
....mi sarvirebbe anche sul lavoro!


E come andava usata la gets?

 E come andava usata la gets?
come dovresti vedere dal tuo man gets o dall'help in linea
se hai un qualche compilatore sotto windows o dal tuo manuale
di c:
#include <stdio.h>
char *gets(char *s);
gets() reads a line from stdin into the buffer pointed  to
by  s  until either a terminating newline or EOF, which it
replaces with '\0'.  No check for buffer overrun  is  per­formed.
gets() return s on success, and NULL on  error
or  when  end of file occurs while no characters have been
read.
Quindi stavi cercando di leggere qualcosa dallo standard input
"dentro" il numero ritornato dalla system... visto come
puntatore. Una cosa chiaramente assurda.
(Anche il compilatore penso si sia rifiutato di fare una cosa simile,
o abbia mandato diversi warning).
ciao,
g.


diversi?? ...direi un bel po'!

 Non mi è tanto chiara!:-(
se non ti e' chiara la descrizione della gets allora bisogna
che ti prendi un manuale e ti studi il C.
La gets prende una stringa terminata da un "a capo" dallo
standard input (cioe' in pratica da quello che digiti con la
tastiera o da quello che passi al programma attraverso una pipe
o una redirezione dell'input) e lo memorizza nel array di caratteri
che gli passi. Questo indirizzo costituisce inoltre il valore di
ritorno della funzione. Come di consueto dovrai avere allocato
in modo statico o dinamico spazio per l'array s in cui la gets
va a memorizzare la stringa. Se cerca di leggere una stringa piu'
lunga di quella prevista il programma puo' avere
comportamenti imprevedibili e andare in crash (per questo motivo
e' sconsigliabile usare la gets in generale ed e' assolutamente
da evitare in programmi "seri": e' meglio usare la funzione
piu' generale fgets che serve per leggere da uno stream (compreso se si 
vuole lo stdin) un numero massimo specificato di caratteri).
ciao
g.

 
Quindi:
FILE *genere;
genere = fopen("genere.txt", "r");
if (genere == NULL) printf ("Errore nella lettura del file\n");
else {
       int c;
       while ((c=fgetc(genere)) !=EOF) putchar(c);
       fclose(genere);
}
Questo l'ho trovato come esempio e l'ho adattato, però ho capito che in 
ciclo legge il file in stream fino alla fine del file.
Però non mi è chiara ancora una cosa, se voglio prendere un file txt da 
10 righe per esempio e queste le voglio inserire in un array da poter 
richiamare il riga 6 con: pippo[6], come faccio?

 richiamare il riga 6 con: pippo[6], come faccio?
supponendo che tu sappia a priori che ogni riga ha al massimo
100 caratteri...
FILE *f;
char Testo[10][100];
int i;
f  = fopen("pippolino.txt","r");
for (i=0; i<10; i++)
   fgets(Testo[i],100,f);
fclose(f);
A questo punto le righe sono memorizzate in
Testo[0], Testo[1], Testo[2],...., Testo[9].
Pero' (come specificato in "man fgets") viene memorizzato
anche il ritorno a capo '\n' che separa le righe
Per eliminarlo puoi usare la funzione strchr definita in
string.h
la strchr(char *s, int c) che trova la prima occorrenza
del carattere c nella stringa s e restituisce il puntatore
alla posizione (o NULL se non c'e').
quindi
char *p;
for (i=0; i<10; i++)
{
    p = strchr(Testo[i],'\n');
    if (p!=NULL)  *p='\0';
}
In pratica, per ogni riga di testo vado a vedere se contiene un ritorno
a capo '\n'. Se lo contiene sara' l'ultimo carattere, per come e' 
definita la fgets, e lo sostituisco con il carattere terminatore '\0' 
che indica la fine della stringa.
Se non sai a priori quanto possono essere lunghe al massimo
le righe, o non sai a priori quante sono etc.etc.
le cose si complicano leggermente.
ciao,
g.

 
Il problema che le righe vengono fuori da:
system("find /root -iname \"*.mp3\" > outscan.txt");
Ho messo root per dei test, ma nel programma sarà /multimedia/mp3
Quindi il file outscan.txt ha n righe. Ne ho caricati 10 per prove, ma 
potrei averne anche 10000, può reggere questo "char Testo[10000][50]"?

 potrei averne anche 10000, può reggere questo "char Testo[10000][50]"?
500.000 bytes ?
Dovrebbe reggere, ma puoi fare:
char **Testo;
int i;
Testo = malloc(10000*sizeof(char *));
for (i=0; i<10000; i++) Testo[i]=calloc(50,1);
che regge di sicuro.
ciao
g.


Grazie mielle, sei gentilissimo

 ...mi confondi le idee più di quanto non lo sono già!
Se sei messo cosi', allora usa pure char Testo[10000][50];
Con il gcc dovrebbe compilare senza problemi.
In generale ho qualche difficolta' a risponderti perche'
mi sembra di capire che non parliamo lo stesso linguaggio,
il C :-)
In bocca al lupo per l'esame, e se per un qualche miracolo
lo passi, per espiare invece di accendere un cero alla Madonna,
magari dai una occhiata ad un manuale.
ciao,
g.

 
Crepi! ....e se faccio entrabe le cose??:-)
Ciao...
Michele

 Se hai scritto qualche libro....!:-)
Per ora solo uno molto tecnico, e comunque non di C...
Io libri di C non ne leggo da molti anni (da una prima versione
del K&R), quindi non saprei dirti.
Magari apri un nuovo thread con quella domanda e qualcuno
sapra' risponderti.
ciao,
g.