» Utilizator
LAMP
» Parteneri» De citit» Recomandari» Taskuri securitate » Statistici
  • 64782 de mesaje.
  • 7635 de topicuri.
  • 1081 de utilizatori.
  •  
  • purcelllefevreo e ultimul utilizator inregistrat.
[Detalii]

 

| |
Pagini: [1]
Print

make : Utilitarul make; Programe C de lucru cu fisiere Unix [707 afisari]

ale215
*


Mesaje: 97
OfflineOffline


folosind functiile "cu f": fopen(), fclose(), fread(), frwite(),
fprintf(), fscanf(), fgets(), fputs(), feof(), fflush(), fseek()
se cere un program care converteste un fisier text intre
formatul DOS (liniile terminate cu <cr><lf>) si formatul UNIX
(liniile terminate cu <lf>), si viceversa.

imi da  careva o idee de cum s-ar face problema Straight face
Logged

22-05-2009, 11:45 Twitt ::
Agkelos
*


Mesaje: 7180
OnlineOnline

WWW

Nu e complicat. Citesti fisierul folosind fgets() si inlocuiesti \r\n cu \n.

Dar ce legatura are cu make? Trebuie sa folosesti make in toata chestia asta?
Logged

22-05-2009, 11:47 Twitt ::
ale215
*


Mesaje: 97
OfflineOffline


Da, trebuie folosit make.Rasfoind manualul de SO am gasit titlul "Conversii Linux-DOS" si spre surprinderea mea am gasit rezolvarea problemei mele.Dar problema este ca unele linii din cod nu le inteleg.
Programul este format din 3 coduri surse.Primul se numeste Capete.C care, folosind un fisier temporar, elimina spatiile suplimentare de la sfarsitul fiecarei linii(si de la inceput).
Code:
#include <stdio.h>
#define MAX 255

main(int argc,char *argv[])
{
   FILE *f;
   int i, n=MAX;
   char s[MAX], *TEMP = argv[1];
   if((f=fopen(TEMP,"w")) == NULL)
       exit(1);
   for(;;)
   {
      if (fgets (s,MAX,stdin)==NULL)
              break;
      if (s[strlen(s)-1] == '\n')
           s[ strlen(s)-1]=0;
      for(i=0; s[i]== ' ';i++);
      if ( i == strlen(s) )
            s[0] = '\0';
      else
           {
             if ( i < n )
               n = i;
             if (i)
                 {
                 for (i=strlen(s)-1;s[i] == ' '; i--);
                 s[++i]='\0';
                 }
           }
          fwrite ( s, 1, strlen (s)+1,f);
   }
fclose(f);
f= fopen(TEMP, "r");
for (;;)
{
   for (i=0;;i++)
   {
       if(fread (s+i,1,1,f) == 0)
            goto STOP;
       if (s[i] == '\0')
             break;
   }
   if ( s[0] )
      printf ("%s\n",s+n);
    else
      printf ("\n");
}
STOP:fclose(f);
}
Nu inteleg:
Code:
   for(;;)
   {
      if (fgets (s,MAX,stdin)==NULL)
si
Code:
for (;;)
{
   for (i=0;;i++)
   {
       if(fread (s+i,1,1,f) == 0)
Urmatorul cod realizeaza conversia DOS-Linux(doli.sh):
Code:
#!/bin/sh
if [$# -ne 3]
then
    echo "Apel: doli dirDOS dirLINUX \"nume_fisiere_de_convertit\""
    exit 1
fi

for i in $1 $2
do
    if [ ! -d $i ]
       then echo "\"$i"nu este director";exit 2
    fi
done

PR=/tmp/$(UID)$$
DC=`PWD` /
cd $2
DIRLINUX=`pwd`/
cd $DC
cd $1
DIRDOS=`pwd`/
for i in `ls $3`
do
   echo ${DIRDOS}$I "->"${DIRLINUX}$i
   tr -d "\r" <$i | ${DC}capete ${PR}.temp >${DIRLINUX}$i
done             
Nu inteleg:
Code:
PR=/tmp/$(UID)$$
si
Code:
tr -d "\r" <$i | ${DC}capete ${PR}.temp >${DIRLINUX}$i
Iar ultimul realizeaza conversia Linux-DOS(lido.sh):
Code:
#!/bin/sh
if [$# -ne 3]
then
    echo "Apel: lido dirLINUX dirDOS \"nume_fisiere_de_convertit\""
    exit 1
fi

for i in $1 $2
do
    if [ ! -d $i ]
       then echo "\"$i"nu este director";exit 2
    fi
done

PR=/tmp/${UID}$$
DC=`pwd` /
cd $2
DIRDOS=`pwd`/
cd $DC
cd $1
DIRLINUX=`pwd`/
for i in `ls $3`
do
   echo ${DIRLINUX}$i "->"${DIRDOS}$i
   $(DC)capete $(PR).temp <$i | tr "\n" "\r" | \
   sed 's/'` echo "\r"` '/'` echo "\r\n"` '/g' >$(DIRDOS)$i   
done             
Nu inteleg:
Code:
PR=/tmp/${UID}$$
si
Code:
$(DC)capete $(PR).temp <$i | tr "\n" "\r" | \
   sed 's/'` echo "\r"` '/'` echo "\r\n"` '/g' >$(DIRDOS)$i   
Multumesc!
Logged

24-05-2009, 09:42 Twitt ::
Agkelos
*


Mesaje: 7180
OnlineOnline

WWW

Bucla for() fara elemente in interior e o metoda pentru a crea o bucla infinita (ca while(1)). Conditia de iesire trebuie sa fie undeva in blocul de cod asociat buclei.

In doli.sh PR e un fisier temporar format ca $(UID)$$, adica se creaza in /tmp un fisier  care are ca nume user ID-ul utilizatorului care ruleaza scriptul urmat de doua cifre aleatoare ($$).
Logged

24-05-2009, 11:20 Twitt ::
Claudiu
*


Mesaje: 1537
OfflineOffline

WWW

Eu nu inteleg urmatorul lucru, ce este make? La ce te referi? Intr-o perioada foloseam CMake pentru a crea executabilele din cod sursa... Ce iti trebuie tie e cod de C Straight face Ma scuzati daca am aberat aici, dar numai ce am jucat vreo 6 ore de baschet  batting eyelashes
Logged

24-05-2009, 21:01 Twitt ::
ale215
*


Mesaje: 97
OfflineOffline


Code:
Utilatarul make s-a nascut din nevoia de a compila, linkedita si
instala proiecte mari, alcatuite din sute sau mii de fisiere
sursa. Pentru a explica rolul utilitarului make, recapitulam
pasii in care mai multe fisiere sursa C sau ASM sunt compilate si
linkeditate impreuna intr-un fisier executabil: Fie mai multe
fisiere sursa C, cu numele sursa1.c, sursa2.c, sursa3.c.  In mod
normal, aceste fisiere sunt compilate separat de catre orice
compilator C in fisiere individuale obiect: sursa1.o (sau
sursa1.obj), sursa2.o si sursa3.o. Dupa compilare, in faza de
linkeditare din cele trei fisiere obiect rezulta fisierul
executabil. Se pot recunoaste usor acesti pasi si in asamblarea
si linkeditare impreuna a mai multor fisiere ASM intr-un singur
fisier executabil (vezi laboratorul de programare multimodul de
la Arhitectura Calculatoarelor).

Daca din cele trei fisiere sursa de mai sus se modifica doar
sursa2.c, care din pasii de mai sus trebuie repetati? Evident, nu
este necesara recompilarea in fisiere obiect a fisierelor
sursa1.c si sursa3.c, este necesara doar recompilarea lui
sursa2.c. In urma acestei recompilari se va modifica si sursa2.o,
lucru care impune relinkeditarea tuturor fisierelor obiect in
fisierul executabil final. Utilitarul make, folosind un fisier de
configurare cu numele Makefile, "are grija" ca din pasii necesari
obtinerii unui anumit fisier (in cazul nostru fisierul executabil
final) sa se execute doar acesi pasi necesari.

Prezentam in continuare in fisier Makefile pentru exemplu enuntat
mai sus:

demo.exe : sursa1.o sursa2.o sursa3.o
gcc -o demo.exe sursa1.o sursa2.o sursa3.o
sursa1.o : sursa1.c
gcc -c sursa1.c
sursa2.o : sursa2.c
gcc -c sursa2.c
sursa2.o : sursa2.c
gcc -c sursa1.c
clean :
rm sursa1.c~ sursa2.c~ sursa3.c ~

Explicatii:

Pe prima linie, fisierul demo.exe, se obtine din fisierele
sursa1.o, sursa2.o si sursa3.o cu comanda de pe linia doi. Prima
linia este folosita de utilitarul make pentru a sti cand trebuie
sa reconstruiasca (prin linkeditare) fisierul demo.exe, iar linia
doi pentru a sti cu ce comanda trebuie sa reconstruiasca acest
fisier.

Linia patru este folosita pentru a contrui fisierul sursa1.o din
fisierul sursa1.c folosind comanda de pe linia cinci. Aceste doua
linii sunt folosita de utilitarul make in doua situatii: a) fie
sursa1.o nu exista, el este necesar la linkeditare finala, si
deci trebuie creat prin comanda de pe linai cinci; b) fie
fisierul sursa1.c are data crearii mai noua decat sursa1.o, fapt
ce impune recompilarea lui sursa1.c. Modificandu-se sursa1.o,
data crearii acestuia va fi mai noua decat data fisierului
demo.exe lucru ce va duce linkeditarea finala. Optinea -c
folosita la compilatorul gcc inseamna "just compile, don't link",
iar optiunea -o inseamna "creaza fisierul executabil cu acest
nume".

Pentru a rula exemplu de mai sus, se tasteaza comanda:
make

Obseravatii:

1. Observati regula clean din fisierul de mai sus. Prin comanda
make clean se executa comanda de dupa aceasta regula (se executa
comanda rm care sterge fisierele de backup)

2. Liniile cu comenzile gcc si rm sunt indentate in dreapta cu
TAB, nu cu spatii!

3. Intr-un fisier Makefile se pot folosi orice comenzi valide
shell pentru a crea un fisier necesar:
exemplu:
fisier_cu_useri_din_sistem :
finger > fisier_cu_useri_din_sistem

sper ca ai inteles Claudiu:)
Logged

26-05-2009, 12:19 Twitt ::
Claudiu
*


Mesaje: 1537
OfflineOffline

WWW

Intr-o perioada foloseam CMake pentru a crea executabilele din cod sursa... Ce iti trebuie tie e cod de C Straight face

Si eu ce-am zis? Smile Atat ca nu stiam daca ai idee ce e make asa ca am incercat sa o spun pe intelesul tuturor. Ce legatura are
folosind functiile "cu f": fopen(), fclose(), fread(), frwite(),
fprintf(), fscanf(), fgets(), fputs(), feof(), fflush(), fseek()
se cere un program care converteste un fisier text intre
formatul DOS (liniile terminate cu <cr><lf>) si formatul UNIX
(liniile terminate cu <lf>), si viceversa.

imi da  careva o idee de cum s-ar face problema Straight face

cu make? Codul se compileaza, linkuieste la fel, nu prea are relevanta ce anume face codul respectiv.

In concluzie intrebarea mea e daca ai nelamuriri cu privire la cod sau cu privire la folosirea utilitarului? Sau cu amandoua?
Logged

26-05-2009, 13:33 Twitt ::
Pagini: [1]
Print
SkullBox Forum  |  Administrare, configurare si intretinere  |  Sisteme de operare  |  Topic: make : Utilitarul make; Programe C de lucru cu fisiere Unix