Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

как выборочно читать строки?

2.7K
18 декабря 2004 года
sys33
55 / / 16.12.2004
У меня есть обычный текстовый файл вида:
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
Из которого я считываю элементы столбца определенного номера и потом строю график.вот Код:
FILE *in=fopen("i://chisla.txt","rb");
int st1=3,st2=2,i=0,j=0,pos=0,num1,num2;
int a[3];
int b[3];
while(!feof(in))
{
fscanf(in,"%d",&num1);
if(pos==st1)
{
i++;
a= num1;
}
if(pos==st2)
{
j++;
b[j]=num2;
}
pos=++pos%MAX;
}
fclose(in);
for(i=1;i<4;i++)
Series1->Add(a,b,clBlue);
}

Но каким образом мне считать нужные мне столбцы, если в файле в первых двух строках записаны ненужные мне данные, например:
z=256 k=700
pz=345 dl=45678 fr=1
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15

Просьба к откликнувшимся писать ответы и код так, чтобы такой ламер как я все понял.
301
18 декабря 2004 года
lord Kelvin
897 / / 08.11.2004
 
Код:
...
int a[3];
int b[3];
for(int variable=0;variable<2;)if(fgetc(in)=='\n')variable++;
while(!feof(in))
{
...
2.7K
18 декабря 2004 года
sys33
55 / / 16.12.2004
Цитата:
Originally posted by lord Kelvin
 
Код:
...
int a[3];
int b[3];
for(int variable=0;variable<2;)if(fgetc(in)=='\n')variable++;
while(!feof(in))
{
...



Спасибо, все работает, но мне не очень понятно как? ведь после for начинается мой обычный цикл, и нет никакого указания на то чтобы игнорировать строки... то есть я понял, зачем variable, что 2 это число игнорируемых строк, что когда натыкается на конец строки, переходит на следующую, но ведь после for идет while и цикл??? Извините за дурацкий вопрос...

301
18 декабря 2004 года
lord Kelvin
897 / / 08.11.2004
Объясняю. Мы читаем по одному байту и файла, пока не натолкнемся на конец строки дважды. (То есть пока не прочитаем две строки). А поскольку мы на эти строки никак не реагируем - мы их пропускаем. Вот. А потом начинает работать твой цикл так, как будто тех двух строк и не было.
2.7K
18 декабря 2004 года
sys33
55 / / 16.12.2004
Цитата:
Originally posted by lord Kelvin
Объясняю. Мы читаем по одному байту и файла, пока не натолкнемся на конец строки дважды. (То есть пока не прочитаем две строки). А поскольку мы на эти строки никак не реагируем - мы их пропускаем. Вот. А потом начинает работать твой цикл так, как будто тех двух строк и не было.


это вроде понял, но... теперь такая проблема...
у меня есть файл аналогичным образом записанный, то есть первые четыре строки не нужны а в массив начинает заносить, начиная с пятой строки, столбцов всего 6, строк в столбцах - 25, переделал программу под этот файл, получил код:
FILE *in=fopen("c://dfh.rez","rb");
int st1=0,st2=2,i=0,j=0,pos=0,num1,num2;
int a[26];
int b[26];
for(int variable=0;variable<4;)if(fgetc(in)=='\n')variable++;
while(!feof(in))
{
fscanf(in,"%d",&num1);
if(pos==st1)
{
i++;
a= num1;
//((TLabel*)Form1->FindComponent("Label"+IntToStr(i))) -> Caption = a;
}
if(pos==st2)
{
j++;
b[j]=num1;
//((TLabel*)Form1->FindComponent("Label"+IntToStr(j))) -> Caption = b[j];
}
pos=++pos%MAX;
}
fclose(in);
for(i=1;i<27;i++)
Series1->AddXY(a,b,"",clBlue);
}
Программа компилируется, запускается, я нажимаю Button1 и на графике ничего не появляется, программа виснет, закрыть не могу, когда нажимаю на значок паузы, рядом со значком плей, вылезает окно под названием CPU с цифрами непонятными... в чем тут дело?

2.7K
18 декабря 2004 года
sys33
55 / / 16.12.2004
Цитата:
Originally posted by sys33

это вроде понял, но... теперь такая проблема...
у меня есть файл аналогичным образом записанный, то есть первые четыре строки не нужны а в массив начинает заносить, начиная с пятой строки, столбцов всего 6, строк в столбцах - 25, переделал программу под этот файл, получил код:
FILE *in=fopen("c://dfh.rez","rb");
int st1=0,st2=2,i=0,j=0,pos=0,num1,num2;
int a[26];
int b[26];
for(int variable=0;variable<4;)if(fgetc(in)=='\n')variable++;
while(!feof(in))
{
fscanf(in,"%d",&num1);
if(pos==st1)
{
i++;
a= num1;
//((TLabel*)Form1->FindComponent("Label"+IntToStr(i))) -> Caption = a;
}
if(pos==st2)
{
j++;
b[j]=num1;
//((TLabel*)Form1->FindComponent("Label"+IntToStr(j))) -> Caption = b[j];
}
pos=++pos%MAX;
}
fclose(in);
for(i=1;i<27;i++)
Series1->AddXY(a,b,"",clBlue);
}
Программа компилируется, запускается, я нажимаю Button1 и на графике ничего не появляется, программа виснет, закрыть не могу, когда нажимаю на значок паузы, рядом со значком плей, вылезает окно под названием CPU с цифрами непонятными... в чем тут дело?


Все я уже и сам разобрался просто надо было массив не целочисленный сделать а float, теперь все работает...

301
18 декабря 2004 года
lord Kelvin
897 / / 08.11.2004
Цитата:
Originally posted by sys33

Все я уже и сам разобрался просто надо было массив не целочисленный сделать а float, теперь все работает...


Оффтоп: всегда приятно, что человек разобрался сам. Молодец!

2.7K
18 декабря 2004 года
sys33
55 / / 16.12.2004
Цитата:
Originally posted by lord Kelvin

Оффтоп: всегда приятно, что человек разобрался сам. Молодец!


Теперь у меня проблема с которой я сам за почти час долбежки по клаве разобраться не могу:
У меня есть файл вида
VTP
z=12
k=17
1 2 3 4 5
6 7 8 10 11
12 13 14 15 16
-------
z=34
k=23
7 9 15 26 78
5 6 7 9 32
34 56 76 84 1
-------
z=33
k=35
25 45 65 67 8
1 2 3 4 5
6 7 8 9 10
-------
и еще 21 такой блок...
Ну так вот представим, что каждый блок отделяется от другого ---------, у меня 24 таких блока, в зависимости от выбора пользователя в ComboBox1, я строю график, выбирая значения, скажем, 1 и 3 столбца указанного пользователем блока... у меня проблема в том, что у меня похоже не получается, задать цикл в котором программа начинает считывать с опред по счету блока и считывает только этот блок, не идя дальше.
Вот мой код, с ним не работает:
FILE *in=fopen("c://dfh.rez","rb");
int st1=0,st2=2,i=0,j=0,pos=0;
float num1,num2;
float a[3];
float b[3];
int page=ComboBox1->ItemIndex;
for(int variable=0;variable<3+page*3;)
if(fgetc(in)=='\n')
variable++;
while(fgetc(in)=='-')// почему это не работает???ведь я хочу читать строки пока не наткнусь на символ - (тире) или взять другое условие//
{
fscanf(in,"%f",&num1);
if(pos==st1)
{
i++;
a= num1;
}
if(pos==st2)
{
j++;
b[j]=num1;
}
pos=++pos%MAX;
}
fclose(in);
for(i=1;i<3;i++)
Series1->AddXY(a,b,"",clBlue);

Может стоить взять в качестве цикла чтение 3 строк? но как это реализовать?

259
18 декабря 2004 года
AlexandrVSmirno
1.4K / / 03.12.2004
Цитата:
Originally posted by sys33

Теперь у меня проблема с которой я сам за почти час долбежки по клаве разобраться не могу:
У меня есть файл вида
VTP
z=12
k=17
1 2 3 4 5
6 7 8 10 11
12 13 14 15 16
-------
z=34
k=23
7 9 15 26 78
5 6 7 9 32
34 56 76 84 1
-------
z=33
k=35
25 45 65 67 8
1 2 3 4 5
6 7 8 9 10
-------
и еще 21 такой блок...
Ну так вот представим, что каждый блок отделяется от другого ---------, у меня 24 таких блока, в зависимости от выбора пользователя в ComboBox1, я строю график, выбирая значения, скажем, 1 и 3 столбца указанного пользователем блока... у меня проблема в том, что у меня похоже не получается, задать цикл в котором программа начинает считывать с опред по счету блока и считывает только этот блок, не идя дальше.
Вот мой код, с ним не работает:
FILE *in=fopen("c://dfh.rez","rb");
int st1=0,st2=2,i=0,j=0,pos=0;
float num1,num2;
float a[3];
float b[3];
int page=ComboBox1->ItemIndex;
for(int variable=0;variable<3+page*3;)
if(fgetc(in)=='\n')
variable++;
while(fgetc(in)=='-')// почему это не работает???ведь я хочу читать строки пока не наткнусь на символ - (тире) или взять другое условие//
{
fscanf(in,"%f",&num1);
if(pos==st1)
{
i++;
a= num1;
}
if(pos==st2)
{
j++;
b[j]=num1;
}
pos=++pos%MAX;
}
fclose(in);
for(i=1;i<3;i++)
Series1->AddXY(a,b,"",clBlue);

Может стоить взять в качестве цикла чтение 3 строк? но как это реализовать?


фрагментик кода

 
Код:
while(!eof(in))
{
   while(fgetc(in)!= '-')// я хочу читать строки пока не наткнусь на символ - (тире) //
   { ...
   }
   while((fgetch(in) == '-') || (!eof(in))); //Пробрасываем ----
} // здесь есть один подводный камушек. Попробуй найти сам. Хотя в твоем случае должно все работать
2.7K
18 декабря 2004 года
sys33
55 / / 16.12.2004
Цитата:
Originally posted by AlexandrVSmirno

фрагментик кода
 
Код:
while(!eof(in))
{
   while(fgetc(in)!= '-')// я хочу читать строки пока не наткнусь на символ - (тире) //
   { ...
   }
   while((fgetch(in) == '-') || (!eof(in))); //Пробрасываем ----
} // здесь есть один подводный камушек. Попробуй найти сам. Хотя в твоем случае должно все работать


Чего то у меня не работает:
Вот файл:
vtp
s=z
d=145
1 2 3 4 5
6 7 3 4 10
11 12 13 14 15
-
d=12 r=31
d=34 f=45
63.3 56.4 67.2 56.8 23.1
12.1 3.1 4.1 5.1 6.1
3.1 4.1 2.1 5.1 6.3
-
f=13
d=67 g=34
1.1 1.1 1.1 0.23 1.3
3.1 4.3 3.3 4.5 6.7
2.3 4.5 6.7 8.7 8.9
-
Вот код:
FILE *in=fopen("c://chisla.txt","rb");
int st1=0,st2=2,i=0,j=0,pos=0;
float num1,num2;
int MAX=5;
float a[3];
float b[3];
int page=ComboBox1->ItemIndex;
for(int variable=0;variable<3+page*3;)if(fgetc(in)=='\n')variable++;
while(!feof(in))
{
while(fgetc(in)!='-')
{
fscanf(in,"%f",&num1);
if(pos==st1)
{
i++;
a= num1;
}
if(pos==st2)
{
j++;
b[j]=num1;
}
pos=++pos%MAX;
}
while((fgetc(in)=='-')||(!feof(in)));
}
fclose(in);
for(i=1;i<4;i++)
Series1->AddXY(a,b,"",clBlue);
Когда в Combobox задаю чтобы читал первый блок, все окей, третий - тоже работает, а второй(который посередине), первая точка -нормальная, вторая - очень большое число, третья - тоже нормальная... почему так? это тот подводный камешек???

301
18 декабря 2004 года
lord Kelvin
897 / / 08.11.2004
А ты заранее знаешь сколько в блоке строк? Если да, то ты просто это количество строк умноженное на номер блока минус один. Уффф. Подробнее надо?=)
2.7K
18 декабря 2004 года
sys33
55 / / 16.12.2004
Цитата:
Originally posted by lord Kelvin
А ты заранее знаешь сколько в блоке строк? Если да, то ты просто это количество строк умноженное на номер блока минус один. Уффф. Подробнее надо?=)


Боюсь, что подробней надо... это в каком месте?
там где for или там где while и почему минус 1? Извините, но я туплю... целый день сегодня пишу эту программу, и, похоже, еще вся ночь впереди...

301
18 декабря 2004 года
lord Kelvin
897 / / 08.11.2004
Цитата:
Originally posted by sys33

Боюсь, что подробней надо... это в каком месте?
там где for или там где while и почему минус 1? Извините, но я туплю... целый день сегодня пишу эту программу, и, похоже, еще вся ночь впереди...


Пускай HIGHT - количество строк в столбце. Пускай NUMBER - номер блока столбцов, который тебе нужен (начиная с нуля)
Тогда мы делаем так

 
Код:
...
for(int variable=0;variable<HIGHT*(NUMBER-1);)if(fgetc(in)=='\n')variable++;
...

HIGHT*(NUMBER-1) - количество строк, которые нам надо пропустить. (Это если блоки строк идут подряд)
2.7K
19 декабря 2004 года
sys33
55 / / 16.12.2004
Цитата:
Originally posted by lord Kelvin

Пускай HIGHT - количество строк в столбце. Пускай NUMBER - номер блока столбцов, который тебе нужен (начиная с нуля)
Тогда мы делаем так
 
Код:
...
for(int variable=0;variable<HIGHT*(NUMBER-1);)if(fgetc(in)=='\n')variable++;
...

HIGHT*(NUMBER-1) - количество строк, которые нам надо пропустить. (Это если блоки строк идут подряд)


Получается непонятная вещь, файл тот же, вот код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
FILE *in=fopen("e://chisla.txt","rb");
int st1=0,st2=2,i=0,j=0,pos=0;
float num1,num2;
int MAX=4;
float a[3];
float b[3];
int page=ComboBox1->ItemIndex;
for(int variable=0;variable<3+(6*Page1);)
//подумайте сами ведь page идет от 0 и т.д.
if(fgetc(in)=='\n')//программа встает тут
variable++;
while(fgetc(in)!='-')
{
fscanf(in,"%f",&num1);
if(pos==st1)
{
i++;
a= num1;
}
if(pos==st2)
{
j++;
b[j]=num1;
}
pos=++pos%MAX;
}
fclose(in);
for(i=1;i<4;i++)
Series1->AddXY(a,b,"",clBlue);
}
Все компилируется, но когда нажимаю на кнопку просто виснет... когда перехожу в окно с кодом вижу, что программа встала на помеченном выше месте. В чем может быть дело, а форула, которую вы мне писала, кажется будет такой: Height+(6*Number-1), шесть это в моем случае, я визуально прикинул по файлу, должно работать...

301
19 декабря 2004 года
lord Kelvin
897 / / 08.11.2004
Код:
FILE *in=fopen("input.txt","rb");
 int page=1, // Номер блока строк
     column1=0, // Номер Х столбца
     column2=2, // Номер Y столбца
     position=0;
 float x[3],y[3],buffer;
 int xpos=0,ypos=0,MAX=5;
 for(int variable=0;variable<5*(page+1)-3;)if(fgetc(in)=='\n')variable++;
 for(int i=0;i<15;i++) // Считываем 15 чисел - столько их в одном блоке
 {
  fscanf(in,"%f",&buffer);
  if(position==column1)x[xpos++]=buffer;
  if(position==column2)y[ypos++]=buffer;
  position=++position%MAX;
 }
 fclose(in);
 for(int i=0;i<3;i++)Series1->AddXY(a,b
,"",clBlue);
// А что такое Series1?

Вот этот код работает. Лично проверял.
На вот таком файле

s=z
d=145
1.0 2.0 3.0 4.0 5.0
6.0 7.0 3.0 4.0 10.0
11.0 12.0 13.0 14.0 15.0
d=12 r=31
d=34 f=45
63.3 56.4 67.2 56.8 23.1
12.1 3.1 4.1 5.1 6.1
3.1 4.1 2.1 5.1 6.3
f=13
d=67 g=34
1.1 1.1 1.1 0.23 1.3
3.1 4.3 3.3 4.5 6.7
2.3 4.5 6.7 8.7 8.9
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог