tablice, wpisanie zmiennej do innej tablicy

0

Witam, mam prawdopodobnie dość prosty problem do rozwiązania.

O to kod zrodlowy:

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

int main()
{
    char tab[2000];
    char linki[100];
    int i,j;
    char k;
    for (i=0;i<strlen(linki);i++);
        linki[i]=' ';
    FILE *p;
    p = fopen( "index.html", "r" );
    if( p == NULL )
    {
        printf("\n Nie moge odczytac pliku: %s\n");
        return 0;
    }
    fread(tab,1,2000,p);
    fclose( p );
    for(i=0,j=1;i<strlen(tab);i++,j++)
    {
        if (tab[i]=='<'&&tab[j]=='a')
          {
              printf("Znaleziony link na %d miejscu\n",i);

          }
    }
    for (i=0;i<strlen(linki);i++)
    printf(" %d link na %d \n",i,linki[i]);
    return 0;
}

Chce wpisać wartości znajdowanego "i" jako elementy tablicy linki. Probowalem na wiele sposobów jednakże udało mi się jedynie przypisać maksymalnie dwie kolejne wartości "i". Czy możecie mi pomoc ?

0

Nie wiem czy interesuję cię inne rozwiązanie ale ja bym użył klasy string i jej metod: find, substr.

0

Zacznij od zapoznania czym jest c-string i czym się różni od tablicy.

for (i=0;i<strlen(linki);i++);
linki[i]=' ';

Ta pętla zacznie szukać najbliższe zero od początku tablicy (może znaleźć gdzieś daleko poza tablicą),
po czym zwiększy zmienną "i" i znowu zacznie szukać zera tym razem od drugiego elementu tablicy.
Dopiero po zakończeniu pętli wykona się wpisanie spacji.
To co chcesz osiągnąć da się zrobić tak:
memset(linki,' ',sizeof(linki));
Po wczytaniu z pliku za pomocą fread tablica tab nie jest napisem bo nie kończy się zerem.
Więc nie możesz używać strlen(), użyj to co fread zwraca.
Pętla porównującą lepiej zrobić tak:

for(i=0;i<FreadResul;++i)
  {
   if (!strncmp(tab+i,"<a",2))
     {
      printf("Znaleziony link na %d miejscu\n",i);
     }
  }

Co do pytania to nawet nie rozumiem o jakie wpisywanie ci chodzi.

0

Dobrze, program ktory pisze ma znalezc w tekscie html wszelkie odsylacze, wypisac je i sprawdzic czy znajduja sie w bierzacym katalogu. Ma byc to program napisany w jezyku c. Do tablicy chcialem wpisac numery pozycji na ktorych zaczynal sie znacznik do wpisywania linku, aby potem je wypisac i nastepnie nazwy plikow uzyc do sprawdzenie czy w danym katalogu sie znajduja :) Prosze tylko o wskazowki, poniewaz chce ten program napisac sam, ale jak widac moja wiedza jest nadal podstawowa.

Btw. o funkcji fread, tego nie wiedzialem, dziekuje za informacje.

"<a" jak tu wpisac: f=" ?

0

Do tablicy typu char możesz wpisać liczbę nie większą niż 127 przy pewnych (nie zawsze kompatybilnych) zabiegach nie większą niż 255.
Na plik przydzieliłeś 2000 bajtów chyba jasne że nie dasz rady wpisać np 1990 do char.
Jak w pętle znajdziesz początek linka to możesz od razu dopisać zmienną i do tabeli, do tego potrzebujesz licznik aktualnie zapisanych (na początku - zero).
Może zadawaj pytania w języku polskim, bo tego ostatniego nie rozumiem.

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

int main()
{
    char tab[2000];
    int linki[100];
    int i,z;
    int k=0;
    FILE *p;
    p = fopen( "index.html", "r" );
    if( p == NULL )
    {
        printf("\n Nie moge odczytac pliku %s\n");
        return 0;
    }
    fread(tab,1,2000,p);
    fclose( p );
for(i=0;i<sizeof(tab);++i)
  {
   if (!strncmp(tab+i,"ef=", 3))
     {
      printf("Znaleziony link na %d miejscu\n",i);
      tab[k]=i;
      k++;
     }
  }
    z=strlen(linki);
    for (i=0;i<z;i++)
    printf("%d link na %d \n",i,linki[i]);
    printf("\nilosc znalezionych linkow = %d",k);
    return 0;
}

no cóż, nie działa.

0

Nie zrozumiałeś lub zignorowałeś to co mówiłem o rozmiarze odczytanym, fread zwraca ile bajtów zostało wczytano.
Do jakiej tablicy pozycji twoich "linków" zapisujesz?

0
{
   if (!strncmp(tab+i,"ef=", 3))
     {
      printf("Znaleziony link na %d miejscu\n",i);
      linki[k]=i;
      k++;
     }
  } 

fread zwraca ilosc elementow ktore wczytal do tablicy, po napotkaniu na znak konca pliku. Wiec szczerze nie wiem co to mam wpisac. Gdy zmienilem nazwe tablicy dochodzi jedynie do 2 wpisu. Tzn wyswietla tylko 2 wpisy.

0
#include <stdio.h>
#include <string.h>
     
int main()
  {
   char tab[2000];
   int linki[100],liczniklinkow=0;
   int i,licznikznakow;
   FILE *p;

   if(!(p=fopen("index.html","r"))) printf("Nie moge odczytac pliku\n");
   else
     {
      licznikznakow=fread(tab,1,2000,p);
      fclose(p);
      for(i=0;i<licznikznakow;++i)
        {
         if(!strncmp(tab+i,"ef=",3))
           {
            printf("Znaleziony link na %d miejscu\n",i);
            linki[liczniklinkow++]=i;
           }
        }
      printf("ilosc znalezionych linkow = %d\n",liczniklinkow);
      for(i=0;i<liczniklinkow;++i) printf("%d link na %d\n",i+1,linki[i]);
     }
   return 0;
  }
0

Udało mi się samemu to uruchomić, sam nie wiem czemu nie działał.

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

int main()
{
    char tab[2000];
    int linki[100];
    int i;
    int k=0;
    FILE *p;
    p = fopen( "index.html", "rb" );
    if( p == NULL )
    {
        printf("\n Nie moge odczytac pliku %s\n");
        return 0;
    }
    fread(tab,1,2000,p);
    fclose( p );
for(i=0;i!=2000;++i)
  {
   if (!strncmp(tab+i,"ef=", 3))
     {
      printf("Znaleziony link na %d miejscu\n",i);
      linki[k++]=i;
     }
  }
    for (i=0;i<k;i++)
    printf("%d link na %d \n",i,linki[i]);
    printf("\nilosc znalezionych linkow = %d",k);
    return 0;
}
 

Teraz wiem już co zwraca fread i poprawie powyższy kod według twojego. Dziękuje ci bardzo za pomoc, no cóż następnym razem bede musial bardziej zwracac uwage na szczegoly.

0

Nie działał bo:

  1. Analizowałaś i nadał analizujesz nie tyle znaków ile wczytałeś.
  2. Zapisywałeś początki linków do tablicy znaków zamiast tablicy linków.
  3. Do wyświetlenia listy linków zapominałeś o swoim liczniku "k", i używałeś strlen który przeznaczony dla napisów nie do tablic i tym bardziej nie do tablic int'ów.
  4. Masz bałagan w nazwach zmiennych, zawsze będzie ci się coś mieszać dopóki nie zaczniesz nadawać zmiennym znaczących nazw.
0

Tak, już pozmieniałem nazwy zmiennych, dodałem kilka funkcji które skracają program bo trochę mi się wydłużył.
Zostało mi jeszcze dodanie wyszukiwanie odsyłaczy do zdjęć i tu mam pytanie na przyszłość:

     FILE *p;
    p = fopen( "obrazek.img", "rb" );
    if( p == NULL )
    {
        printf("\n Nie moge odczytac pliku %s\n");
        return 0;
    }

Taka formuła sprawdzania czy plik jest w katalogu będzie również działać z plikami graficznymi ?

btw. program już sprawdza tyle elementow ile jest potrzebne i nic wiecej.

0

Przepraszam za kolejny post, ale mam jeszcze kilka pytan.

Znalazłem w pliku html nazwę pliku do którego odwołuję się odsyłacz. Kod html wczytałem do tablicy poprzez funkcję fread toteż wiem tylko pomiędzy ktorymi pozycjami w mojej tablicy znajduje sie nazwa pliku. Potrzebuje wyuskac ta nazwe i zapisac ja jako string, abym nastepnie sprawdzic czy dany plik znajduje sie bieżacym katalogu. Ktoś wie jak to zrobić ?

0
char tb[]="ala ma kota";
int p=4,k=6;
char buf[100];
int len=k-p;
memcpy(buf,tb+4,len);
buf[len]=0;
printf("ma=%s",buf);
0

Witam

To znów ja.
Mam kolejny problem, teraz już chyba trudniejszy.
Moj program generuje juz gotowy plik z nazwami plikow. Pomyslalem, ze najszybsza metoda na sprawdzenie czy w biezacym katalogu znajduja sie dane pliki bedzie porownanie pliczku generowanego przez moj program z tym plikiem statystyki, ktorego mozna utworzyc z wiersza polecen.
Wiem, ze w c sluzy do tego funkcja system(); Oczywiscie chodzi mi o system Windows.

Tutaj pojawia się problemy: Moj program obsluguje tylko katalog gdzie znajduja sie pliki z mojej aplikacji. Gdy chce zmienic katalog na inny za pomoca np system(cd F:\cos); Niestety nie udaje się to, program albo nie wyswietla nic albo wyswietla ze podany katalog nie mogl zostac znaleziony. Glownym celem, ktory chce osiagnac jest odpalenie mojego programu z wiersza polecen, ktorego argumentem jest sciezka do pliku .html. Nastepnie chce by z tej samej sciezki moj program generował ten pliczek statystyki, a bym mogl po prostu porownac te dwa pliczki i wtedy bede juz wiedzial czy pliki sie zgadzaja czy nie.

Licze na wskazówki jak to napisac, lub gdzie szukac sposobow jak takie cos napisac. Niestety w mojej ksiazce do nauki jezyka c szeroko opisany jest jedynie UNIX, a jesli chodzi o Winde to tylko jest krotka wzmianka o wierszu polecen.

Wiem, ze jest cos takiego jak WinAPI, ale ja chce napisac w miare prosta aplikacje i myslalem ze cmd DOS'a w zupelnosci do tego wystarcza ;x

0

Zamiast wywoływać system, użyj FindFirstFile, FindNextFile i FindClose do wyliczenia plików.

0

To jest biblioteka windows.h ? Myślałem, ze sie bez tego obejdzie, bo jeszcze nigdy nie pracowałem z tymi funkcjami.
Poczekam, moze ktos cos jeszcze wymysli :P

0

Poradziłem sobie inaczej:
Na początku potrzebna jest biblioteka dirent.h
i kodzik :

DIR *dir;
struct dirent *ent;
dir = opendir ("f:\\progwww");
if (dir != NULL) {

/* Wypisanie plikow z katalogu */
while ((ent = readdir (dir)) != NULL) {
fprintf (oc,"%s\n", ent->d_name);
}
closedir (dir);
} else {
/* Nie mozna otworzyc katalogu */
perror ("");
return EXIT_FAILURE;
} 

Działa bezproblemowo na Windowsie. Ale i tak chyba bede musial to napisac w inny sposob.

@Edit Zmienilem koncepcje, tak tez dziala.

    char str[256];
    strcpy (str,"dir ");
    strcat (str,argv[1]);
    /*strcat (str," && dir << out.txt");*/ /*Gdy chce dodac to zapisywanie do pliku program wywala blad: w tym momencie << bylo nieoczekiwane*/ 
    printf ("%s\n",str);
	system(str);

jak zrobic by zapisalo mi do pliku zawartosc tego katalogu ? Może to win 7, sprawdze na virtualnym dysku na xp czy dziala dobrze jeszcze.

1 użytkowników online, w tym zalogowanych: 0, gości: 1