Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: элемент массива  (Прочитано 913 раз)

0 Пользователей и 1 Гость просматривают эту тему.

sersne

  • Автор темы
  • Гость
элемент массива
« : 28 Июля 2011, 13:20:22 »
как обратиться к элементу массива, например есть код:


main()
char * buf;


f = fopen("example.html", "r");
if ((len = fread(buf, 1, BUF_SIZE-1, f)) >0)
{
      printf("%c", buf[10]); //как получить то что в 10 элементе массива
}
fclose(f);

Оффлайн inkblack

  • Старожил
  • *
  • Сообщений: 1216
    • Просмотр профиля
Re: элемент массива
« Ответ #1 : 28 Июля 2011, 13:30:27 »
Элементы начинаются с нулевого.

Десятый элемент — это buf[9].

Если у вас в файле русские буквы (или какие другие не ASCII символы), то задача усложняется. В разных кодировках может получиться совсем разное. Особенно если файл в UTF-8. В этой кодировке бОльшая часть символов (но не все) записываются двумя байтами.

Да, ещё вы объявили указатель на buf, а где вы отвели память для символов?

Правильно так:

#define BUF_SIZE 1000000 // или сколько подсказывает ваша фантазия

main() {
 char buf[BUF_SIZE];
 ...
 ...
}
« Последнее редактирование: 28 Июля 2011, 13:34:27 от inkblack »
Делюсь знаниями, но их у меня мало!

sersne

  • Автор темы
  • Гость
Re: элемент массива
« Ответ #2 : 28 Июля 2011, 14:27:24 »
я так пологаю что buf[SIZE_BUF] при открытии файла example.html скаченного из интернета, содержит исходник html. так что всё таки будет в buf[] при открытии файла?

я то пологал что в buf будет что то типа этого:
<html><head>#13#10   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />#13#10   <meta name="description" content="Ответ" />
   <meta name="keywords" content="PHP, MySQL, bulletin, board, free, open, source, smf, simple, machines, forum" />#13#10   <script language="JavaScript" type="text/javascript" src="https://forum.ubuntu.ru/Themes/default/script.js"></script>

пример взят из исходника этой страницы. по идее это и должно быть в buf. при этом мне придется работать только с сылками на изображение и сылки на файлы типа mp3, flv, avi ... что то типа <a href=" https://forum.ubuntu.ru/index.php?action=post;topic=162409.0;num_replies=1" >данный документ</a>.

Оффлайн hippi90

  • Активист
  • *
  • Сообщений: 433
    • Просмотр профиля
Re: элемент массива
« Ответ #3 : 28 Июля 2011, 15:43:02 »
Начну по порядку, сначала по вашему коду. Работать он не будет: вы объявляете указатель char *buf, но память, на которую он указывает, не выделяете.
При открытии файла FILE *f = fopen("example", "r"); происходит инициализация структуры FILE *f, которая хранит в себе файловый дескриптор, текущее положение в файле и т.д.
При помощи функции fread(void *ptr, size_t size, size_t nmemb, FILE *stream) вы записываете nmemb элементов размером size из файла (вернее потока) *stream в буфер *ptr. Соответственно, в вашем случае вы запишете первые BUF_SIZE-1 байт из файла в буфер, buf[10] будет 11 по порядку байтом в файле.

Теперь что касается С и парсинга XHTML, есть гораздо более предназначенные для этого языки, как пример - Perl, я бы посоветовал Python, в нем есть готовые модули, предназначенные для разбора XHTML, например, html5lib.

andrey_p

  • Автор темы
  • Гость
Re: элемент массива
« Ответ #4 : 28 Июля 2011, 15:43:26 »
1. Будет байт. Какой - неизвестно. Пример со страницей этого форума, как раз подходит для подобного утверждения.
2. Байт и символ (character) в современных условиях - разные вещи (чтобы убедиться в этом - запустите "echo abcdфыва | wc -c" в консоли. Однако для С - это понятия одинаковы.
3. С хороший язык для одновременного обучения архитектуре компьютера и программированию, а также для системного программирования и написания низкоуровневых библиотек. Для всего остального его использовать не стоит.

sersne

  • Автор темы
  • Гость
Re: элемент массива
« Ответ #5 : 28 Июля 2011, 16:13:00 »
тот код исходника - приблизительный пример. я лишь хочу узнать как обратиться к например 10 элементу страницы. данный пример работает:


#include <sys/types.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>

#define BUF_SIZE 1000000


int main(int argc, char * argv[])
{
  int pid, status;
  int buf[BUF_SIZE];
  int buf1[100];
  long len, i, index;
  FILE * f;
  FILE * d;

  char *nargv[] = {"wget","--output-document=example.html",argv[1],(char *) 0 };

    pid = fork();
   if (pid == 0) {
     execvp(nargv[0], &nargv[0]);
     perror("execvp");
     return EXIT_FAILURE; // Never get there normally
   }
   else {
     if (wait(&status) == -1) {
       perror("wait");
       return EXIT_FAILURE;
     }
     if (WIFEXITED(status))
     {
       printf("Child terminated normally with exit code %i\n", WEXITSTATUS(status));


   f = fopen("example.html", "r");
       len = fread(buf, 1, BUF_SIZE-1, f);

       d = fopen("logfile", "w");

       fwrite(buf, 1, strlen(buf), d);

       fclose(d);   
       fclose(f);

   } 
   }
   
   return 0;
}


но в файле logfile должен быть только один символ, 10-ый символ. и размер файла должен быть равным 1 байт. вот я и спрашиваю как это сделать.
выслушаю любые идеи. но пожалуста не другой язык программирования, я пока изучаю работу с колсолью (и это после windows VB, Delphi, контроллеров avr и т.д.).
« Последнее редактирование: 28 Июля 2011, 16:25:15 от sersne »

Оффлайн hippi90

  • Активист
  • *
  • Сообщений: 433
    • Просмотр профиля
Re: элемент массива
« Ответ #6 : 28 Июля 2011, 16:27:07 »
Ну тогда соответственно:
fputc(buf[9], d);

Вместо
fwrite(buf, 1, strlen(buf), d);

sersne

  • Автор темы
  • Гость
Re: элемент массива
« Ответ #7 : 28 Июля 2011, 16:49:35 »
спасибо, дошло... буду "шаманить" дальше.

sersne

  • Автор темы
  • Гость
Re: элемент массива
« Ответ #8 : 03 Августа 2011, 15:48:51 »
кто знает в какой ресурс можно ткнуть нос, что бы найти информацию о массивах в частности и о си глобально.

Оффлайн SergeyIT

  • Зануда.
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5744
  • Все по палатам!
    • Просмотр профиля
Re: элемент массива
« Ответ #9 : 03 Августа 2011, 17:25:55 »
Библиотека... не?
Извините, я все еще учусь

Оффлайн inkblack

  • Старожил
  • *
  • Сообщений: 1216
    • Просмотр профиля
Re: элемент массива
« Ответ #10 : 03 Августа 2011, 18:38:11 »
кто знает в какой ресурс можно ткнуть нос, что бы найти информацию о массивах в частности и о си глобально.

А в чем конкретно проблема? Возьмите Кернигана и Ритчи для начала.
Делюсь знаниями, но их у меня мало!

sersne

  • Автор темы
  • Гость
Re: элемент массива
« Ответ #11 : 04 Августа 2011, 08:08:40 »
не библиотека, а работа со строками. на сколько я понял работа со строками в си невозможна, только с массивами char. в этом и возникла проблема. немогу создать файл с URL. пока на этом завис. файл html сохраняется без проблем, но работать с этим файлом у меня не получается. когда пользуюсь функциями cpycat для добавления символа в массив (в котором уже есть например "https://forum.ubuntu.ru/", а надо в массив char дописать "index.php?action=post;topic=162409.0;num_replies=10" вот с этим проблемма) - пишет ошибка сегментирования

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: элемент массива
« Ответ #12 : 04 Августа 2011, 08:57:15 »
sersne осиль уже прочитать про указатели и работу с памятью в языке Си
без базовых понятий ты вообще ни чего не сможешь сделать.
http://www.rsdn.ru/article/cpp/ObjectsAndPointers.xml
http://www.rsdn.ru/article/cpp/ObjectsAndPointers2.xml

 

Страница сгенерирована за 0.016 секунд. Запросов: 22.