Модераторы: 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   Вверх
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   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.1176 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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