Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сложный fscanf, fscanf 
V
    Опции темы
Su_
  Дата 11.9.2008, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 386
Регистрация: 1.8.2007

Репутация: нет
Всего: нет



Добрый вечер

у меня есть input.txt  который генерит програмка
она выводит такой оутпут



sdf 

closed
fsd
 0
fsdf
 0
fsdf
 0


sdf 

closed
fsd
 0
fsdf
 0
fsdf
 0
fgdf
 0

3
sdf 

closed
fsd
 0



как мне прочитать такой файлик , если у меня первые четыре строки фиксированные , а остальное зависит , от того что в них найдено ...т.е. если в 3 строке находиться 2 это значит что после  4 строки будет 4 строки 
sdfsd
0
sdfsd
5
например



я делаю так :
Код



    if(!res)
    {
    


        res=fopen("result.txt","r");

test=1;
     fscanf(res,"%d\n%s\n%d\n%s", &test,str1[test],&tmp[test],openclose[test]); // тут я читаю что что ///мне нужно сначало
 
count_id=test;
count[test]=test;

    for (int k=1;k<=tmp[test];k++) //тут я пытаюсь прочитать дальнейшие пары.
    {
     fscanf(res,"%s %d", save[count[test]][k],vote[count[test]][k][1]);
    }



это естественно не работает , даже на одном варианте..подскажите как решить такую задачку?



--------------------
user posted image

PM MAIL WWW   Вверх
Rickert
Дата 12.9.2008, 01:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 0
Всего: 52



В чём проблема-то?
Раз у тебя всё по строкам, то я бы читал fgets()'ом.


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Su_
Дата 12.9.2008, 01:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 386
Регистрация: 1.8.2007

Репутация: нет
Всего: нет



а можно пример, а то я с с++ не дружу уже))..а то что из начальных данных нужно читать разное кол-во других данных?


--------------------
user posted image

PM MAIL WWW   Вверх
inside_pointer
Дата 12.9.2008, 01:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 9.3.2008

Репутация: 5
Всего: 12



Цитата

fscanf(res,"%d\n%s\n%d\n%s"


\n не будет считаться ожидаемым символом, т.к. это один из символов пустого пространства, это будет равнозначно

Код

fscanf(res,"%d%s%d%s"

PM MAIL   Вверх
Su_
Дата 12.9.2008, 01:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 386
Регистрация: 1.8.2007

Репутация: нет
Всего: нет



ну с этим вроде нормально) хотя может можно и без \n


--------------------
user posted image

PM MAIL WWW   Вверх
inside_pointer
Дата 12.9.2008, 01:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 9.3.2008

Репутация: 5
Всего: 12



в смысле у тебя блоки идут(функция их не воспримет как отдельные)
PM MAIL   Вверх
inside_pointer
Дата 12.9.2008, 01:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 9.3.2008

Репутация: 5
Всего: 12



Цитата

как мне прочитать такой файлик , если у меня первые четыре строки фиксированные , а остальное зависит , от того что в них найдено ...т.е. если в 3 строке находиться 2 это значит что после  4 строки будет 4 строки 

пользуясь fgets'ом ты читаешь строку и у тебя даже число читается как строка
потом из строки вырезаешь всё до перевода строки sscanf(line, "%s", cmpline);
(cmpline символьный массив длиной в 100)

для сравнения строк используется функция stcmp которая возвращает -1, 0, 1
strcmp(cmpline, "2") == 0

дальше задаёшь параметр для цикла с fgets'ом, она не будет следить пустая строка там или нет, но и fscanf тоже не будет следить, если не применишь спецприёмы с квадратными скобочками типа %[^\n] для остановки на каждом переводе
слежку для fgets'а можно задать с помощью той же функции сравнения strcmp(line, "\n") == 0
PM MAIL   Вверх
Su_
Дата 12.9.2008, 01:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 386
Регистрация: 1.8.2007

Репутация: нет
Всего: нет



мне просто надо прочитать сначала кусок ,из него понять скоко в нем будет пар,и читать это кол-во пар ,после него ,,,..это все пишеться в массив с индексов 1  например..и так далее,...эти кучки нужно записывать в индексированные массивы.. я не очень понимаю ,как мне например читать 
строку например с 5 по , какойто разделительный знакк .. ?


--------------------
user posted image

PM MAIL WWW   Вверх
Rickert
Дата 12.9.2008, 03:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 0
Всего: 52



Код
 const unsigned int bufferSize = 4096;
char buffer[bufferSize];
FILE* file = fopen("readMe.txt", "r");
int num, i;
int counter = 0;

if (!file)
  return;

while(1)
{
  memset(bufferSize, 0, bufferSize);
  if (fgets(buffer, bufferSize, file) == EOF)
    break;
  num = atoi(buffer);// теперь в num нужное тееб число.
  if ((counter == 4) && (num != 0)) //4 - номер строки, число в которой проверяем на значение
  {
    //здесь считываем то что надо, если число не 0.
    for (i = 0; i < num; ++i)
    {
      memset(buffer, 0, bufferSize);
      if (fgets(buffer, bufferSize, file) == EOF) // теперь в buffer у нас строка с доп. параметрами, которые появляются, если 4 строка в файле не 0.
        break;
    }
  }
  ++counter;
}
fclose(file);



--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Su_
Дата 12.9.2008, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 386
Регистрация: 1.8.2007

Репутация: нет
Всего: нет



что то она на eof материться


Код

E:\univer5\tks\tcp\server\server1.cpp(126) : error C2664: 'memset' : cannot convert parameter 1 from 'const unsigned int' to 'void *'
        Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
E:\univer5\tks\tcp\server\server1.cpp(127) : error C2446: '==' : no conversion from 'const int' to 'char *'
        Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
E:\univer5\tks\tcp\server\server1.cpp(127) : error C2040: '==' : 'char *' differs in levels of indirection from 'const int'
E:\univer5\tks\tcp\server\server1.cpp(130) : error C2065: 'counter' : undeclared identifier
E:\univer5\tks\tcp\server\server1.cpp(136) : error C2446: '==' : no conversion from 'const int' to 'char *'
        Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
E:\univer5\tks\tcp\server\server1.cpp(136) : error C2040: '==' : 'char *' differs in levels of indirection from 'const int'
Error executing cl.exe.



)мм, спасибо большое , очень выручили)!!!

Это сообщение отредактировал(а) Su_ - 12.9.2008, 12:17


--------------------
user posted image

PM MAIL WWW   Вверх
inside_pointer
Дата 12.9.2008, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 9.3.2008

Репутация: 5
Всего: 12



здесь на примере не файла а потока ввода, обрабатывается кусок, проходим до тройки, после неё до нуля считаем количество строк (если две - пара есть)

Код

#include <stdio.h>
#include <string.h> /* забыл добавить, тоже немаловажно, т.к. имплицитное объявление прототипа может приводить к неуловимым ошибкам, здесь случайно получилось всё правильно */

#define MAXLINE 1000

main()
{
    /*
    1 
    sdf 
    3 
    closed
    fsd
    0
    fsdf
    0
    fsdf
    0
    */
    
    char line[MAXLINE], *p;
    int n;
    
    while ((p = fgets(line, MAXLINE, stdin)) != NULL) {
        sscanf(line, "%s", line);
        if (strcmp(line, "3") == 0)
            break;
    }
    
    n = 0;
    while ((p = fgets(line, MAXLINE, stdin)) != NULL) {
        sscanf(line, "%s", line);
        if (strcmp(line, "0") != 0)
            n++;
        else    
            break;
    }
    
    printf("%d\n", n);
    
    return 0;
}



ты спрашивал про символы, как читать с пятого символа строки

если line[1000] = "12345"; то читать с тройки надо printf("%s\n", line+2);
выведет 345
(line - это &line[0] - это как бы первый символ line+1 - второй символ, line+2 - третий символ)

Это сообщение отредактировал(а) inside_pointer - 12.9.2008, 23:39
PM MAIL   Вверх
Su_
Дата 15.9.2008, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 386
Регистрация: 1.8.2007

Репутация: нет
Всего: нет



ну как я понимаю line[1000] = "12345"; это   sprintf(line,"12345"); 

и на строчке while ((p = fgets(line, MAXLINE, stdin)) != NULL) { , она зацикливаеться сама на себе (


--------------------
user posted image

PM MAIL WWW   Вверх
Rpahut
Дата 16.9.2008, 01:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


0xdeadbeef
*


Профиль
Группа: Участник
Сообщений: 243
Регистрация: 9.4.2006

Репутация: 2
Всего: 7



Su_, я не понял чего ты пытаешься сделать =), но после вот этого кода у тебя в переменной i будет лежать количество строк, а указатели на сами строки - в массиве line. Естесна они пронумерованы начиная с нуля.
Код

    #define MAXLINES 1000

    FILE *f;
    int filesize;
    int i;
    char *line[MAXLINES];
    char *buf;

    f = fopen("test.txt", "rb");
    if(f) {
        memset(line, 0, sizeof(char*)*MAXLINES);

        fseek (f , 0 , SEEK_END);
        filesize = ftell (f);
        fseek (f , 0 , SEEK_SET);
        buf = malloc(filesize+1);
        if(buf) {
            buf[filesize] = 0;
            fread(buf, 1, filesize, f);
            i=0;
            line[i] = buf;
            do {
                line[++i] = strchr(line[i-1], '\n');
                if(line[i]) {
                    *line[i] = 0;
                    line[i]++;
                }
            }
            while(line[i]);
        }
        fclose(f);
    }

--------------------
C/C++ GameDevRSS Раздела программирования игрOpenGL - уроки от NeHeКак продать идею?
PM MAIL   Вверх
Su_
Дата 16.9.2008, 03:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 386
Регистрация: 1.8.2007

Репутация: нет
Всего: нет



что то не работает ,

ругаеться сюда 
  buf = malloc(filesize+1);
и 
так
error C2440: '=' : cannot convert from 'void *' to 'char *'


--------------------
user posted image

PM MAIL WWW   Вверх
inside_pointer
Дата 16.9.2008, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 9.3.2008

Репутация: 5
Всего: 12



Цитата("Su_")

и на строчке while ((p = fgets(line, MAXLINE, stdin)) != NULL) { , она зацикливаеться сама на себе ( 

sscanf не может зациклиться сама на себе, т.к. это не scanf
scanf работает с потоком ввода пока он не закончится, а sscanf работает со строкой пока она не закончится
там закомментированные строки их надо в поток ввода вписать


sdf 

closed
fsd
0
fsdf
0
fsdf
0

она(программа) дойдёт до тройки, после тройки посчитает строки пока не встретится ноль
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1192 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.