Операции с файлами на С

Тема в разделе "WASM.BEGINNERS", создана пользователем Saessie, 10 авг 2009.

  1. Saessie

    Saessie New Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    29
    Надо написать такую программу на чистом С (С++ не годится):

    программа считывает данные из текстового файла вот такого вида:
    5.7 2.0
    1.2 -76.4
    -1123.0 2341
    342.23 654.99
    #
    123.321 123.456
    654.223 -543.555
    #
    456.223 -123.667
    -234.567 -5039.23
    #
    и т.д. Файл заканчивается знаком #

    Программа должна считывать числа в 2 массива предположительно так:
    Код (Text):
    1.         fp = fopen("abcd.txt","r");
    2.         for(int i=0;i<linenumber;i++)
    3.         {
    4.                 fscanf(fp,"%f %f",&x[i],&y[i]);
    5.         }
    6.         fclose(fp);
    до первого символа #, после чего вызывать другую программу. Как только та (другая) отработает, продолжается считывание следующих двух массивов, расположенных между двумя знаками # и т.д. до конца файла.

    Не могу понять как:
    1) определить linenumber (число строк между двумя знаками #)
    2) заставить программу определять знак #
    3) определить конец файла
     
  2. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Код (Text):
    1. char myString[STRING_SIZE];
    2. ...
    3. while (!feof(stdin)) \\как определить конец файла. Хотя можно и по возврату ф-ии fscanf
    4. {
    5.      fscanf_s(fp,"%[^\n]s",myString,STRING_SIZE); \\как считывать всё построчно, включая символ "#"
    6.      \\Здесь делается проверка, является ли строка символом "#"
    7.      
    8.      \\Если в строке данные, то читаем их:
    9.      sscanf_s(myString,"%f%f",&x[i],&y[i]);
    10. }
    Вопрос "как определить linenumber?" не понимаю. Брать и считать, сколько строк считывали.
     
  3. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Прошу прощения... разумеется не stdin, а указатель на соответствующую структуру FILE. В Вашем случае вместо stdin должна быть fp.
     
  4. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Да и комментарии не теми слешами понавтыкал. :)
     
  5. Saessie

    Saessie New Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    29
    Отлично, да вот только компилятор не понимает операторов fscan_s и sscanf_s -- только fscanf и sscanf
     
  6. djmans

    djmans New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2006
    Сообщения:
    312
    оставте fscanf и sscanf, fscan_s и sscanf_s это параноидальные аналоги от ms.
     
  7. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    djmans
    Ну да... параноидальные. Как раз отличное место для эксплоита будет. :) Надо будет только строчку какую-нибудь в файле немного длиннее STRING_SIZE сделать.
     
  8. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Создаёте файловую секцию и проецируете её. Далее работа как с массивом данных в память.
     
  9. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    fscanf(fp, "%255s", my_string) (для строк не длиннее 255 символов) спасёт отца русской демократии...
     
  10. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    diamond
    Знаю, что спасёт. :)
     
  11. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Clerk
    Уж это слишком для программки из первого поста, которая тянет максимум на лабу в универе.
    Тем более, что программу задали написать на Си и скорее всего имели в виду рантайм, а не апишки.
    fscanf и прочая лабуда из stdio прекрасно справятся с задачей.
    Не надо усложнять там, где не требуется)