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

Поиск:

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


0xdeadbeef
*


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

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



Цитата(Su_)

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


Попробуй подключить "mozg.h", должно помочь. ;)

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


Опытный
**


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

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



вроде все сделал как хотел , одна загвоздка .. 
если сделать в отдельном проекте то все нормально ,, когда себе встраиваю в виде функции то , пропускает цикл While , т.е. 
код:

Код

int reservscopy(FILE *res); //описываю
int main(void) {
res=fopen("result.txt", "r");
if(!res) //проверку проходит нормально
{
   printf("Input file incorrect.\n");
   exit(1);   
}
reservscopy(res);  //вызываю функцию

//сама функция:


int reservscopy(FILE *rest)
{
    

int a,c;
char a2[100],c1[100],c2[100],c3[100];
     int b;
    char line[MAXLINE]=" ", *p;
    char line1[MAXLINE]=" ";
    int n;
    int ccc;

char a1[100][100];
  
char ba[100];
char strt[100];

if(!rest) //тут то же нормально
{
   printf("Input file incorrect.\n");
   exit(1);   
}


if (rest!=NULL) { //тут то же нормально входит в if



    while ((p = fgets(line, MAXLINE, rest)) != NULL) {  //отсюда уходит на return 0 вопрос почему???
        sscanf(line, "%s%s%s%s",strt,c1,c2,c3);
        a=atoi(strt);
        c=atoi(c2);
            if (strcmp(strt, "st") == 0)
            {
               break;
     } 
    else {
count[a]=a;
sprintf(str1[count[a]],"%s",c1);
tmp[count[a]]=c;
sprintf(openclose[count[a]],"%s",c3);

  printf("\n");       
    


printf("id = %d ,theme = %s , maxalt = %d ,status = %s \n",count[a] ,str1[count[a]],tmp[count[a]],openclose[count[a]]);
    } 
   
    n = 0;
    while ((p = fgets(line, MAXLINE, rest)) != NULL) {
   
           sscanf(line, "%s%d", strt, &b);
if (strcmp(strt, "st")== 0)
goto F;

sprintf(save[count[a]][n],"%s",strt);
vote[count[a]][n][1]=b;
printf("%s %d \n",save[count[a]][n], vote[count[a]][n][1]);
F:


       if (strcmp(strt, "stop") != 0)
            n++;
        else    
            break;
    }
    }


}
return 0;

}




в текксте программы указан вопрос , вообще не понимаю , по идею он не правильно считывает файл , но в отдельном проектк асболютно то же самое и там все нормально , .. как он может проходить проверки !res и выходить на while....!=NULL 
,а так спасибо большое , наконец то разобрался))!


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

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


Опытный
**


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

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



Цитата(Su_ @ 17.9.2008,  02:09)
вроде все сделал как хотел , одна загвоздка .. 
если сделать в отдельном проекте то все нормально ,, когда себе встраиваю в виде функции то , пропускает цикл While , т.е. 
код:

Код

int reservscopy(FILE *res); //описываю
int main(void) {
res=fopen("result.txt", "r");
if(!res) //проверку проходит нормально
{
   printf("Input file incorrect.\n");
   exit(1);   
}
reservscopy(res);  //вызываю функцию

//сама функция:


int reservscopy(FILE *rest)
{
    

int a,c;
char a2[100],c1[100],c2[100],c3[100];
     int b;
    char line[MAXLINE]=" ", *p;
    char line1[MAXLINE]=" ";
    int n;
    int ccc;

char a1[100][100];
  
char ba[100];
char strt[100];

if(!rest) //тут то же нормально
{
   printf("Input file incorrect.\n");
   exit(1);   
}


if (rest!=NULL) { //тут то же нормально входит в if



    while ((p = fgets(line, MAXLINE, rest)) != NULL) {  //отсюда уходит на return 0 вопрос почему???
        sscanf(line, "%s%s%s%s",strt,c1,c2,c3);
        a=atoi(strt);
        c=atoi(c2);
            if (strcmp(strt, "st") == 0)
            {
               break;
     } 
    else {
count[a]=a;
sprintf(str1[count[a]],"%s",c1);
tmp[count[a]]=c;
sprintf(openclose[count[a]],"%s",c3);

  printf("\n");       
    


printf("id = %d ,theme = %s , maxalt = %d ,status = %s \n",count[a] ,str1[count[a]],tmp[count[a]],openclose[count[a]]);
    } 
   
    n = 0;
    while ((p = fgets(line, MAXLINE, rest)) != NULL) {
   
           sscanf(line, "%s%d", strt, &b);
if (strcmp(strt, "st")== 0)
goto F;

sprintf(save[count[a]][n],"%s",strt);
vote[count[a]][n][1]=b;
printf("%s %d \n",save[count[a]][n], vote[count[a]][n][1]);
F:


       if (strcmp(strt, "stop") != 0)
            n++;
        else    
            break;
    }
    }


}
return 0;

}




в текксте программы указан вопрос , вообще не понимаю , по идею он не правильно считывает файл , но в отдельном проектк асболютно то же самое и там все нормально , .. как он может проходить проверки !res и выходить на while....!=NULL 
,а так спасибо большое , наконец то разобрался))!

Цитата("Su_")

 while ((p = fgets(line, MAXLINE, rest)) != NULL) {  //отсюда уходит на return 0 вопрос почему???


цикл заканчивает работу(это может быть и на самом первом шаге) когда fgets встретила конец файла или не смогла прочитать вообще что-либо из файла(такое бывает когда файл открыт на запись и читать из него нельзя)
когда файл вообще не открыт случается сегфолт

Цитата("Su_")

sscanf(line, "%s%s%s%s",strt,c1,c2,c3);


эта запись означает что в строке должны быть куски по типу
one two three four
они могут быть и
1 2 3 4

то есть если у тебя
abcdefg_hijklmn_opq_rstu
это поместится в strt а остальные останутся пустыми
и у тебя не будет кусков типа
one\ntwo\nthree\nfour
т.к. fgets читает только одну строку и в ней есть только один символ конца строки (в самом конце)
при использовании
sscanf(line, "%s", line);
из строки считывается из "one two three four\n" только one
из "one1\n" считывается one1
это использовано для того чтобы функции strcmp передавать на сравнение кусок без \n

ещё
Код

if(!res) //проверку проходит нормально
{
   printf("Input file incorrect.\n");
   exit(1);   
}


замени на

Код

if(!res) //проверку проходит нормально
{
   fprintf(stderr, "error: Input file incorrect.\n");
   exit(1);   
}

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


Опытный
**


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

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



ну у меня result.txt выгледит  так

Код

1 sdf 9 close
st
fsd 4
fsdf 2
fsdf 6
fsdf 2
fsdf 6
fsdf 2
fsdf 6
fsdf 2
fsdf 6
stop
2 sdf 3 close
st
fsd 5
fsdf 6
fsdf 7
stop
3 sdf 3 close
st
fsd 5
fsdf 6
fsdf 7
stop
4 sdf 5 close
st
fsd 5
fsdf 6
fsdf 7
fsdf 6
fsdf 7
stop


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



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

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


Опытный
**


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

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



осталось маленький подвопрос на это жу тему .. 
как читать , не из файла а из строки , такого же типа файл

Код

musik
pop
rok
juzz


что бы в  a[0] был musik в a[1]  был pop  и . д , до конца строки , ??
делал 
while(gets(buff)!=Null) не работает , не переходит дальше по строчке , что понятноо.. как же сделать?


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

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


Опытный
**


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

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



по поводу gets, забудь про неё, вместо неё используют fgets(line, MAXLINE, stdin)

Код

#include <stdio.h>

main()
{
    char line[5] = "", *p;
    char c = 'z';
    
    printf("%s\n", line);
    printf("%c\n", c);
    
    if ((p = gets(line)) == NULL)
        return 1;
    
    // вводим 20 символов aaaaaaaaaaaaaaaaaaaa
    
    printf("%s\n", line);
    printf("%c\n", c);
    
    // в c записалось a
    // прога вывалилась, но может и продолжить работать
    
    return 0;
}



а вот второе, разобрать строку, есть функция strtok, до полного разбирательства пользоваться не рекомендую, т.к. вроде всё красиво всё должно работать, однако потом напарываешься на всякую фигню (время теряешь)

Код

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAXLINE   5000    /* максимальная длина строки */
#define MAXLINES  300     /* максимальное количество строк */
#define MAXWORD   100     /* максимальная длина слова строки */ 

main()
{
    char line[MAXLINE], *lines[MAXLINES], word[MAXWORD], *p;
    int i, rwd, offset;
    
    strcpy(line, "one\ntwo\nthree\nfour\n");
    printf("%s", line);
    
    offset = 0;
    for (i = 0; (rwd = sscanf(line+offset, "%s", word)) == 1; i++)
        if ((p = (char *) malloc(strlen(word)+1)) == NULL) {
            fprintf(stderr, "error: no memory for %s\n", word);
            exit(1);
        } else {
            strcpy(p, word);
            lines[i] = p;    
            offset += strlen(word)+1;
        }
    
    for (i = 0; i < 4; i++)
        printf("%s\n", lines[i]);
    
    exit(0);
}


такой работает, malloc делает что: она для каждой строки создаёт блок памяти её размера, потом в него её записывает, и дальше указатель на этот блок помещает в массив указателей
получается массив указателей на строки

Это сообщение отредактировал(а) inside_pointer - 19.9.2008, 07:30
PM MAIL   Вверх
Su_
  Дата 19.9.2008, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



мм , просто супер , спасибо большое , сегодня все всторил в программку , наладил , работает как часы , ))еще раз Огромное спаибо , я думаю вопрос РЕШЕН)!


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

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


Опытный
**


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

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



вот ещё надыбал как можно читать строку с помощью scanf, правда нет ограничения на её длину (то есть можно ввести слишком длинную строку которая не предусмотрена)

Код

#include <stdio.h>

#define MAXLINE  1000

main()
{
    char line[MAXLINE];
    int res;
    
    while ((res = scanf("%[^\n]%*1[\n]", line)) == 1)
        printf("%s\n", line);
    
    return 0;
}

в результате получается цикл где срабатывают строки

Код

[guest@localhost 7_glava]$ echo -e "abcd\nabcd\n\n\nabcd" | ./test
abcd
abcd
[guest@localhost 7_glava]$ echo -e "abcd\nabcd\n abcd" | ./test
abcd
abcd
 abcd

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

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

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

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

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


 




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


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

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