Не читается файл

Тема в разделе "LANGS.C", создана пользователем ajak, 5 сен 2008.

  1. ajak

    ajak New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2007
    Сообщения:
    463
    Вот собственно исходник

    Хочу видеть его внутренности в виде хексов. Ничегоне получается

    #include <stdio.h>
    int main()
    {
    FILE *rom;
    char c[20];
    rom = fopen("c:\\1.txt","r");
    if (rom) printf("\n123"); // для проверки
    fread(c,1,1,rom);/////////////<= неработает
    printf("%x",с); ////////////// Выводит почему то два байта ff23
    //////////////////////при разных файлах, которые открываю

    return 1;
    }
     
  2. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    откуда вы взяли, что не работает?
    вы выводите адрес массива вместо его содержимого
     
  3. ajak

    ajak New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2007
    Сообщения:
    463
    Точно, я дятел,только ночью во сне понял
     
  4. ajak

    ajak New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2007
    Сообщения:
    463
    Вот как надо

    printf("%x",*c);

    Только читается один байт, но правильный

    fread(c,4,2,rom);
    А вот эти аргумента 4,2 не изменяют ничего. ВСё равно читается 1 байт. Скажи в чём проблема. Там текст 20 символов. А у меня только 1 выдаётся.
     
  5. ajak

    ajak New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2007
    Сообщения:
    463
    Вот проверил только что.
    Если так делать printf("%x",c[1]); или с[2], то видны символы. А весь текст в хексе вывести , в цикле чтоль.
     
  6. ajak

    ajak New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2007
    Сообщения:
    463
    И вот ещё что. Почему когда переданы такие параметры

    fread(c,1,1,rom);
    у меня получается видеть даже 5-тый байт, хотя в буфер я его не помещал
    printf("%x",c[4]);
     
  7. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    сообразительный
    *c означает что надо взять один элемент массива, на который указывает с. массив char, сталобыть ждать, что считается int не стоит, есле конешно не привести типы
    а откуда компилятору знать что ты там помещал в буфер, а что - нет? это твои проблемы - следить за тем, чтоб не вылазить за пределы считанного.

    p.s. испоьзуй тег code.
     
  8. ajak

    ajak New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2007
    Сообщения:
    463
    Уменя просто плохо с указателями и я забываю постоянно что имя массива -это адрес первой переменной. Практики мало. Вот чижу и и кодю -повышаю уровень. Спасибо что помогаете. А вот ещё вопрос

    #include <stdio.h>
    #include <conio.h>
    struct header
    {
    char stack[4];
    char pc[4];
    };

    int main()
    {
    header h;
    clrscr();
    FILE *rom;
    rom = fopen("c:\\1.txtr");
    fread(&h,1,sizeof(h),rom);
    printf(h.stack);
    return 1;
    }

    Читаю из файла в созданую структуру.
    Когда пишу printf(h.pc); -выдаёт последние 4 байта
    а когда
    printf(h.stack); все 8 включая 4 последних, а почему не 4 первых, в структуре же явно объявлено. Структура это же не объединение.
     
  9. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    ajak, как тебе уже выше сказал уважаемый
    Freeman:
    а по существу: почитай что такое Си-строки (хотя бы здесь), и все станет понятно. у тебя нигде нет явного маркирования конца строки (Си-строки заканчиваются нулем), или же хранения в отд. переменной длины строки, а потому когда ты пытаешься вывести на экран первую строку из структуры header, выводится и та, что следует за нею, до тех пор, пока не встретится терминирующий нуль.
    скорее всего при записи структур в файл ты не завершаешь строки этой структуры нулём, и, следовательно, при считывании этих структур из файла ты получаешь ненужные сложности по поводу разруливания конца строки.
    и еще: почему ты открыв файл, никогда его не закрываешь? юзай fclose(FILE *);
     
  10. ajak

    ajak New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2007
    Сообщения:
    463
    Спасибо. А что за тэг code? Чёт в хэлпе про него ничего. Что он даёт?
     
  11. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    ajak
    :)))
    имеется ввиду при написании на этом форуме сообщения помещать Си код в теги [ code ][ code ] (без пробелов ессно) для его удобочитаемости.
     
  12. ajak

    ajak New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2007
    Сообщения:
    463
    ААААААААААААААааааааааааааа. :) Понял.
    Ещё такой вопрос. Когда кодил в паскале, там проше было. Не было этого нулевого символа. А теперь си. И у меня есть большая структура, записи которой неравномерны по размерам.

    Код (Text):
    1. struct header
    2. {
    3. char stack[4];
    4. char pc[4];
    5. char pcс[41];
    6. char _pc[34];
    7. ....
    8. ..
    9.  
    10. };
    Типа этого. И что мне теперь все строки, после того как, я считаю файл в структуру обрабатывать? . Файл- не текст. Просто бинарик.
    Но отдельные компоненты имеют разные размер. Поэтому и исп. тип char
     
  13. ajak

    ajak New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2007
    Сообщения:
    463
    2)Блин, чёт не могу ничего понять. Приходить писать сюда.
    Почему при исп. следующей инструкции
    Код (Text):
    1. header h;
    2. h.stack="1234";
    Компиль ругается и говорит про левосторонее значение. Равме что я не могу переопределить переменную?
     
  14. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    потомучто h.stack - это массив из 4 элементов char, а "1234" по сути указатель на строку "1234" с завершающим нуль-символом.
    будет правельно, если написать чтото типа
    Код (Text):
    1. h.stack[0]="1234"[0]
    2. //or
    3. memcpy((void*)h.stack,(const void*)"1234",4);
     
  15. ajak

    ajak New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2007
    Сообщения:
    463
    А что по поводу записей? Кто подскажет?
    Код (Text):
    1. struct header
    2. {
    3. char stack[4];
    4. char pc[4];
    5. };
    Как добиться того, чтобы после заполнения структуры из файла в которой нету конца строки при выводе переменной stack показывались 4 а не 8 байт, или все последующие?
     
  16. ajak

    ajak New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2007
    Сообщения:
    463
    Вот главный вопрос. Что мне делать с типом char. В нём у меня содержаться 16-ные числа. Но чтобы их вывести мне нужно прогонять циклом функцию printf, т.к. при передачи в это функцию просто строки- выводится аски коды, а они мне не нужны, т.к. некоторые символы не видны. К какому типу лучше преобразовать тип char. Посоветуйте.МНе нужно фидеть хексы из char а не аски.
     
  17. ajak

    ajak New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2007
    Сообщения:
    463
    Народ, что, никто не поможет с проблемой?
     
  18. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    чем не нравицо прогонять принтф в цикле?
     
  19. ajak

    ajak New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2007
    Сообщения:
    463
    Вот что сейчас для меня главное

    Как добиться того, чтобы после заполнения структуры из файла в которой нету конца строки при выводе переменной stack показывались 4 а не 8 байт, или все последующие?
     
  20. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    ajak
    я тебя смутно понял. а зачем хранить 16ричные числа в char ? храни их в unsigned long к примеру. и выводи их как printf("%x", myLongValue);
    почему так нельзя?

    касаемо структур: после их считывания из файла принудительно дополняй строки в этих структурах завершающим нулем. и все будет ок.