как выборочно читать строки?
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
Просьба к откликнувшимся писать ответы и код так, чтобы такой ламер как я все понял.
int a[3];
int b[3];
for(int variable=0;variable<2;)if(fgetc(in)=='\n')variable++;
while(!feof(in))
{
...
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 и цикл??? Извините за дурацкий вопрос...
Объясняю. Мы читаем по одному байту и файла, пока не натолкнемся на конец строки дважды. (То есть пока не прочитаем две строки). А поскольку мы на эти строки никак не реагируем - мы их пропускаем. Вот. А потом начинает работать твой цикл так, как будто тех двух строк и не было.
это вроде понял, но... теперь такая проблема...
у меня есть файл аналогичным образом записанный, то есть первые четыре строки не нужны а в массив начинает заносить, начиная с пятой строки, столбцов всего 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 с цифрами непонятными... в чем тут дело?
это вроде понял, но... теперь такая проблема...
у меня есть файл аналогичным образом записанный, то есть первые четыре строки не нужны а в массив начинает заносить, начиная с пятой строки, столбцов всего 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, теперь все работает...
Все я уже и сам разобрался просто надо было массив не целочисленный сделать а float, теперь все работает...
Оффтоп: всегда приятно, что человек разобрался сам. Молодец!
Оффтоп: всегда приятно, что человек разобрался сам. Молодец!
Теперь у меня проблема с которой я сам за почти час долбежки по клаве разобраться не могу:
У меня есть файл вида
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 строк? но как это реализовать?
Теперь у меня проблема с которой я сам за почти час долбежки по клаве разобраться не могу:
У меня есть файл вида
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(fgetc(in)!= '-')// я хочу читать строки пока не наткнусь на символ - (тире) //
{ ...
}
while((fgetch(in) == '-') || (!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 задаю чтобы читал первый блок, все окей, третий - тоже работает, а второй(который посередине), первая точка -нормальная, вторая - очень большое число, третья - тоже нормальная... почему так? это тот подводный камешек???
А ты заранее знаешь сколько в блоке строк? Если да, то ты просто это количество строк умноженное на номер блока минус один. Уффф. Подробнее надо?=)
Боюсь, что подробней надо... это в каком месте?
там где for или там где while и почему минус 1? Извините, но я туплю... целый день сегодня пишу эту программу, и, похоже, еще вся ночь впереди...
Боюсь, что подробней надо... это в каком месте?
там где for или там где while и почему минус 1? Извините, но я туплю... целый день сегодня пишу эту программу, и, похоже, еще вся ночь впереди...
Пускай HIGHT - количество строк в столбце. Пускай NUMBER - номер блока столбцов, который тебе нужен (начиная с нуля)
Тогда мы делаем так
for(int variable=0;variable<HIGHT*(NUMBER-1);)if(fgetc(in)=='\n')variable++;
...
HIGHT*(NUMBER-1) - количество строк, которые нам надо пропустить. (Это если блоки строк идут подряд)
Пускай 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), шесть это в моем случае, я визуально прикинул по файлу, должно работать...
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