The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Проблемы с  memcpy"
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Проблемы с  memcpy"
Сообщение от XVilka emailИскать по авторуВ закладки(ok) on 05-Июл-04, 13:18  (MSK)
Люди, помогите! Почему-то при выполнении команды

memcpy (iftag, idbuf, 3) прога в iftag записвает не меньше восьми символов :(

      FILE* f;
      char* filename;
      void* idbuf;
      void* iftag;
      ID3_DATA* IDD;

      filename = argv[1];
      f = fopen (filename, "r");
      if (f == NULL)
      {
        fprintf (stderr, "Error reading file: %s!\n", filename);
        return -1;
      }
      idbuf = malloc (128);
      fread (idbuf, 1, 128, f);
      memcpy (iftag, idbuf, 3);
      printf("TAG copy: %s______ \n", (char*)iftag);
      if ((char*)iftag == "TAG")
      {
        printf("qwe,qwe\n");
        memcpy (IDD->SONG, idbuf, 30);
        printf("Artist\n");
        memcpy (IDD->ARTIST, idbuf, 30);
        memcpy (IDD->ALBUM, idbuf, 30);
        memcpy (IDD->YEAR, idbuf, 4);
        memcpy (IDD->COMMENT, idbuf, 30);
        memcpy (IDD->GENRE, idbuf, 1);
        printf("%s\n%s\n%s\n", IDD->SONG, IDD->ARTIST, IDD->ALBUM);
      }
      else
      {
        fprintf (stderr, "No ID3v1 tag info!\n");
      };

А мне надо чтобы он 3 символа считал, и в последующих соmmандах считывал ровно столько символов сколько положено, а не столько сколько ему хочется!

Что делать? Может кто подскажет другую функцию?

  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "Проблемы с  memcpy"
Сообщение от SergeiZz Искать по авторуВ закладки on 05-Июл-04, 14:31  (MSK)
>Люди, помогите! Почему-то при выполнении команды
>
>memcpy (iftag, idbuf, 3) прога в iftag записвает не меньше восьми символов
>:(
>      void* idbuf;
>      void* iftag;
...
>      idbuf = malloc (128);
>      fread (idbuf, 1, 128, f);
>      memcpy (iftag, idbuf, 3);
Не выделена память для iftag:
iftag= malloc( 128 );

>А мне надо чтобы он 3 символа считал, и в последующих соmmандах
>считывал ровно столько символов сколько положено, а не столько сколько ему
>хочется!
Принципиально неверная точка зрения :)
Он всегда делает только то, что ему скажут сделать.

>Что делать? Может кто подскажет другую функцию?
Я бы посоветовал другой язык...

  Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "Проблемы с  memcpy"
Сообщение от XVilka emailИскать по авторуВ закладки(ok) on 05-Июл-04, 15:07  (MSK)

>Не выделена память для iftag:
>iftag= malloc( 128 );

Спасибо! А то я такую очевидную вещь не увидел :)!

>>Что делать? Может кто подскажет другую функцию?
>Я бы посоветовал другой язык...

И чем же так C плох :) ?

И еще - а как 128 байт с конца файла прочитать?

  Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "Проблемы с  memcpy"
Сообщение от XVilka emailИскать по авторуВ закладки(ok) on 05-Июл-04, 15:39  (MSK)
Кстати условие if ((char*)iftag == "TAG")
почему-то оказывается ложным,
хотя если я пишу printf("__%s__\n", (char*)iftag) он выдает все правильно: __TAG__
В чем может быть дело?

      void* idbuf;
      void* iftag;
         .....
      idbuf = malloc (128);
      iftag = malloc (3);
      fread (idbuf, 1, 128, f);
      memcpy (iftag, idbuf, 3);
      if ((char*)iftag == "TAG")

  Рекомендовать в FAQ | Cообщить модератору | Наверх

5. "Проблемы с  memcpy"
Сообщение от SergeiZz Искать по авторуВ закладки on 05-Июл-04, 16:56  (MSK)
>Кстати условие if ((char*)iftag == "TAG")
> почему-то оказывается ложным,
Настоятельно рекомендую другой язык...
Это я на русский разговорный намекаю, между прочим, :)
только не обижайтесь: я не со зла.

>хотя если я пишу printf("__%s__\n", (char*)iftag) он выдает все правильно: __TAG__
>В чем может быть дело?
Лучшую книгу по C написал Керниган...

Если серьёзно, в форуме подобные знания не стоит пытаться приобрести.
Надо читать книгу.


  Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "Проблемы с  memcpy"
Сообщение от SergeiZz Искать по авторуВ закладки on 05-Июл-04, 16:48  (MSK)
>И чем же так C плох :) ?
Обсуждение подоблных вопросов здесь называют флеймом.
На мой взгляд -- не заслуженно...

>И еще - а как 128 байт с конца файла прочитать?
Передвинуть указатель считывания/записи в конец файла (смотри fseek()), сделать им 128 шагов назад, читать.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

6. "Проблемы с  memcpy"
Сообщение от XVilka emailИскать по авторуВ закладки(ok) on 05-Июл-04, 18:18  (MSK)
Проблему я решил следующим образом:


idtag = malloc (4);
      fseek(f, -128, SEEK_END);
      fread (idtag, 4, 1, f);
      printf("rty\n");
      if (!strncmp((char*)idtag, "TAG", 3))

Единственно - он выдает Segmenattion Fault  после исполнения
и до операции


IDD->ARTIST = malloc (30);

struct ID3
{
      void* GENRE;
      void* ARTIST;
      void* ALBUM;
      void* SONG;

};

typedef struct ID3 ID3_DATA;
ID3_DATA* IDD;

В чем дело?

  Рекомендовать в FAQ | Cообщить модератору | Наверх

7. "Проблемы с  memcpy"
Сообщение от SergeiZz Искать по авторуВ закладки on 08-Июл-04, 13:28  (MSK)
>idtag = malloc (4);
>      fseek(f, -128, SEEK_END);
>      fread (idtag, 4, 1, f);
>      printf("rty\n");
>      if (!strncmp((char*)idtag, "TAG", 3))
Верно.

>Единственно - он выдает Segmenattion Fault  после исполнения
>и до операции
>
>
>IDD->ARTIST = malloc (30);
>
>struct ID3
>{
>      void* GENRE;
>      void* ARTIST;
>      void* ALBUM;
>      void* SONG;
>
>};
>
>typedef struct ID3 ID3_DATA;
>ID3_DATA* IDD;
>
>В чем дело?
Нужен полный текст новой версии.
Наверно, забыто опять выделить память (под поля структуры ID3).

  Рекомендовать в FAQ | Cообщить модератору | Наверх

8. "Проблемы с  memcpy"
Сообщение от XVilka emailИскать по авторуВ закладки(ok) on 08-Июл-04, 19:54  (MSK)
Проблема решена:


#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>
#include <string.h>
#include <mysql/mysql.h>
#include "all.h"

extern MYSQL open_mp3db(const char*, const char*, const char*);
extern int close_mp3db(MYSQL);
extern int add_id3_to_table(MYSQL, ID3_DATA);

void print_usage(FILE*, int);
int read_file(const char*, ID3_DATA);
int  main(int, char*[]);

const char* const genre_id3v1[255] = {
      "Blues",
       .......
};


int read_file(const char* input_filename, ID3_DATA IDD)
{
      FILE* f;
      void* idtag;
      unsigned char i[1];
            
      f = fopen (input_filename, "r");
      if (f == NULL)
      {
        fprintf (stderr, "Error reading file: %s!\n", input_filename);
        return 1;
      }
      idtag = malloc (4);
      fseek(f, -128, SEEK_END);
      fread (idtag, 4, 1, f);
      if (!strncmp((char*)idtag, "TAG", 3))
      {
        fseek(f, -1, SEEK_CUR);
        fread (IDD.SONG, 1, 30, f);
        fread (IDD.ARTIST, 1, 30, f);
        fread (IDD.ALBUM, 1, 30, f);
        fread (IDD.YEAR, 1, 4, f);
        fread (i, 1, 1, f);
        printf("i = %d\n%s\n", i[0], genre_id3v1[i[0]]);
        /* IDD.GENRE = genre_id3v1 [i[0]]; */
      }
      else
      {
        fprintf (stderr, "No ID3v1 tag info!\n");
        free(idtag);
        fclose(f);
        return 1;
      };
      free(idtag);
      fclose(f);
      printf("__%s__\n__%s__\n__%s__\n__%s__\n__%s__\n", IDD.SONG, IDD.ARTIST, IDD.ALBUM, IDD.YEAR, IDD.GENRE);
      return 0;
}

int main(int argc, char *argv[])
{
      int next_option;
      const char* const short_options = "ho:i:n:v";
      const struct option long_options[] = {
        { "help",     0, NULL, 'h'},
        { "output",   1, NULL, 'o'},
        { "input",    1, NULL, 'i'},
        { "name",     1, NULL, 'n'},
        { "verbose",  0, NULL, 'v'},
        { NULL,       0, NULL, 0 }
      };

      const char* output_filename = NULL;
      const char* input_filename = NULL;
      const char* song_name = NULL;
      int verbose = 0;

      ID3_DATA IDD;
      MYSQL mysql;

      program_name = argv[0];
      do {
        next_option = getopt_long (argc, argv, short_options, long_options, NULL);
        switch (next_option)
        {
          case 'h':
                print_usage (stdout, 0);
          case 'o':
                output_filename = optarg;
                break;
          case 'i':
                input_filename = optarg;
                break;      
          case 'n':
                song_name = optarg;
                break;
          case 'v':
                verbose = 1;
                break;
          case '?':
                print_usage (stderr, 1);
          case -1:
                break;
          default:
                abort ();
          }
      }
      while (next_option != -1);

      if (!read_file(input_filename, IDD))
      {
        printf("__%s__\n__%s__\n__%s__\n__%s__\n__%s__\n", IDD.SONG, IDD.ARTIST, IDD.ALBUM, IDD.YEAR, IDD.GENRE);
      }
      else
      {
        exit(0);
      }
      mysql = open_mp3db("localhost", "root :)", "не скажу :)");
      add_id3_to_table(mysql, IDD);
      close_mp3db(mysql);
      return EXIT_SUCCESS;
}

all.h :

const char* program_name;

struct MM_HEAD
{
      char* MM_TYPE;
      int   BITRATE;
      int   SAMPLERATE;
      int   COPYRIGHT;
      int   ORIGINAL;
      int   FRAMES;
      int   DATA_SIZE;

};

struct ID3
{
      char GENRE[30];
      char ARTIST[30];
      char ALBUM[30];
      char SONG[30];
      int   TRACK;
      char   YEAR[4];
      char COMMENT[30];
      struct MM_HEAD mm_headers;
};

typedef struct ID3 ID3_DATA;

Но почему -то когда я говорю напечаать компоненты структуры во второй раз он печатает какую-то муть, а в функции read_file он все правильно выводит :(

  Рекомендовать в FAQ | Cообщить модератору | Наверх

9. "Проблемы с  memcpy"
Сообщение от sas emailИскать по авторуВ закладки(ok) on 09-Июл-04, 00:38  (MSK)

1 malloc/free Вам тут вообщем-то не нужен. Стека будет достаточно.
2 В read_file Вы передаете копию структуры. Если хотите увидеть измененные значения,  надо передавать укаазтель на структуру
3 Ваша программа имеет много потенциальных проблем связанных с buffer overflow
4 Сильно советую почитать книг(у/и), понять язык и самому (без подсказок с форумов или от других людей) понять что и почему написано не верно. Сильно вырастете профессионально. Кстати Вам уже это советовали выше.

Успехов
--- sas


>Проблема решена:
>
>
>#ifdef HAVE_CONFIG_H
>#include <config.h>
>#endif
>
>#include <stdio.h>
>#include <stdlib.h>
>#include <getopt.h>
>#include <string.h>
>#include <mysql/mysql.h>
>#include "all.h"
>
>extern MYSQL open_mp3db(const char*, const char*, const char*);
>extern int close_mp3db(MYSQL);
>extern int add_id3_to_table(MYSQL, ID3_DATA);
>
>void print_usage(FILE*, int);
>int read_file(const char*, ID3_DATA);
>int  main(int, char*[]);
>
>const char* const genre_id3v1[255] = {
>      "Blues",
>       .......
>};
>
>
>int read_file(const char* input_filename, ID3_DATA IDD)
>{
>      FILE* f;
>      void* idtag;
>      unsigned char i[1];
>
>      f = fopen (input_filename, "r");
>      if (f == NULL)
>      {
>        fprintf (stderr, "Error reading
>file: %s!\n", input_filename);
>        return 1;
>      }
>      idtag = malloc (4);
>      fseek(f, -128, SEEK_END);
>      fread (idtag, 4, 1, f);
>      if (!strncmp((char*)idtag, "TAG", 3))
>      {
>        fseek(f, -1, SEEK_CUR);
>        fread (IDD.SONG, 1, 30,
>f);
>        fread (IDD.ARTIST, 1, 30,
>f);
>        fread (IDD.ALBUM, 1, 30,
>f);
>        fread (IDD.YEAR, 1, 4,
>f);
>        fread (i, 1, 1,
>f);
>        printf("i = %d\n%s\n", i[0],
>genre_id3v1[i[0]]);
>        /* IDD.GENRE = genre_id3v1
>[i[0]]; */
>      }
>      else
>      {
>        fprintf (stderr, "No ID3v1
>tag info!\n");
>        free(idtag);
>        fclose(f);
>        return 1;
>      };
>      free(idtag);
>      fclose(f);
>      printf("__%s__\n__%s__\n__%s__\n__%s__\n__%s__\n", IDD.SONG, IDD.ARTIST, IDD.ALBUM, IDD.YEAR, IDD.GENRE);
>
>      return 0;
>}
>
>int main(int argc, char *argv[])
>{
>      int next_option;
>      const char* const short_options = "ho:i:n:v";
>
>      const struct option long_options[] = {
>
>        { "help",  
>  0, NULL, 'h'},
>        { "output",  
>1, NULL, 'o'},
>        { "input",  
> 1, NULL, 'i'},
>        { "name",  
>  1, NULL, 'n'},
>        { "verbose",  0,
>NULL, 'v'},
>        { NULL,  
>    0, NULL, 0 }
>      };
>
>      const char* output_filename = NULL;
>      const char* input_filename = NULL;
>      const char* song_name = NULL;
>      int verbose = 0;
>
>      ID3_DATA IDD;
>      MYSQL mysql;
>
>      program_name = argv[0];
>      do {
>        next_option = getopt_long (argc,
>argv, short_options, long_options, NULL);
>        switch (next_option)
>        {
>          case 'h':
>
>            
>    print_usage (stdout, 0);
>          case 'o':
>
>            
>    output_filename = optarg;
>            
>    break;
>          case 'i':
>
>            
>    input_filename = optarg;
>            
>    break;
>          case 'n':
>
>            
>    song_name = optarg;
>            
>    break;
>          case 'v':
>
>            
>    verbose = 1;
>            
>    break;
>          case '?':
>
>            
>    print_usage (stderr, 1);
>          case -1:
>
>            
>    break;
>          default:
>            
>    abort ();
>          }
>      }
>      while (next_option != -1);
>
>      if (!read_file(input_filename, IDD))
>      {
>        printf("__%s__\n__%s__\n__%s__\n__%s__\n__%s__\n", IDD.SONG, IDD.ARTIST, IDD.ALBUM,
>IDD.YEAR, IDD.GENRE);
>      }
>      else
>      {
>        exit(0);
>      }
>      mysql = open_mp3db("localhost", "root :)", "не
>скажу :)");
>      add_id3_to_table(mysql, IDD);
>      close_mp3db(mysql);
>      return EXIT_SUCCESS;
>}
>
>all.h :
>
>const char* program_name;
>
>struct MM_HEAD
>{
>      char* MM_TYPE;
>      int   BITRATE;
>      int   SAMPLERATE;
>      int   COPYRIGHT;
>      int   ORIGINAL;
>      int   FRAMES;
>      int   DATA_SIZE;
>
>};
>
>struct ID3
>{
>      char GENRE[30];
>      char ARTIST[30];
>      char ALBUM[30];
>      char SONG[30];
>      int   TRACK;
>      char   YEAR[4];
>      char COMMENT[30];
>      struct MM_HEAD mm_headers;
>};
>
>typedef struct ID3 ID3_DATA;
>
>Но почему -то когда я говорю напечаать компоненты структуры во второй раз
>он печатает какую-то муть, а в функции read_file он все правильно
>выводит :(

  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру