Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.189.2.122] |
|
Сообщ.
#1
,
|
|
|
Можно ли одновременно открывать несколько *.txt файлов(fopen) и одновременно работать с ними.
Я сделал 2 цикла: один для работы с одним файлом и вложенный для работы с другим. По идее как только вывелась строчка первого файла за ней выводятся все строчки второго. Да первый раз срабатывает все нормально выводится первая строка первого файла а за ним все второго. НО последущие разы выводятся только строки первого файла. Скорей всего надо переводить в конце прочтения второй файл на начало, но как только я пытаюсь выполнить fseek(fl_now,0,SEEK_SET) для второго файла, то все зацикливается??? вот код: #include "stdafx.h" #include <iostream.h> #include <string.h> #include <stdio.h> #include <conio.h> #define star "c:\\11.txt\0" #define now "c:\\22.txt\0" int main(int argc, char* argv[]) { char file_star[20] = star; char file_now[20] = now; char buf1[512],buf2[512]; FILE *fl_star, *fl_now; int k,kk; char staraja[10]; char nowaja[10]; int i,ii; long pos, pos_now; fl_star = fopen(file_star,"r"); if(!fl_star){return 0;} fl_now = fopen(file_now,"r"); if(!fl_now){return 0;} while((k = getc(fl_star)) != EOF) { if((char)k =='@') { pos = ftell(fl_star); fseek(fl_star,(pos - 1),SEEK_SET); fgets(buf1,strlen(buf1),fl_star); i = 0; while((int)buf1[i]!=44) { staraja[i] = buf1[i]; cout<<"staraja[i]=" << staraja[i]; i++; } cout<<"\n"; while((kk = getc(fl_now)) != EOF) { if((char)kk =='@') { pos_now = ftell(fl_now); fseek(fl_now,(pos_now - 1),SEEK_SET); fgets(buf2,strlen(buf2),fl_now); ii=0; while((int)buf2[ii]!=44) { nowaja[ii] = buf2[ii]; cout<< "nowaja[ii]"<<nowaja[ii]; ii++; } cout<<"\n"; } } } } fclose(fl_star); fclose(fl_now); return 0; } Текстовые файлы: Содержимое первого: "c:\\11.txt\0" @T031,"пкупкупцоуцо", @T032,"ьпвьпвпьговл", @T033,"ьпчьрыеьыгел", @T035,"ьпрпвьроглгнлуглглн", @T036,"прьвпьвгоннвлнглл", и второго: "c:\\22.txt\0" @T031,"vwbwtgbtgrbhnewn", @T032,"twhhtwht", @T033,"bwrtbtwt44tb4h", @T035,"q4eth45hthtrwhtrh", @T036,"betbhqtrehnyrrnhn ", |
Сообщ.
#2
,
|
|
|
M Для вставки кода просьба пользоваться тегами [ CODE ]...[ /CODE ] (без пробелов), либо кнопкой «Code» на панели отправки сообщения. Иначе код становится неудобочитаем, особенно в случаях большого количества вложенных блоков. |
Сообщ.
#3
,
|
|
|
#include "stdafx.h"
#include <iostream.h> #include <string.h> #include <stdio.h> #include <conio.h> #define star "c:\\11.txt\0" #define now "c:\\22.txt\0" int main(int argc, char* argv[]) { char file_star[20] = star; char file_now[20] = now; char buf1[512],buf2[512]; FILE *fl_star, *fl_now; int k,kk; char staraja[10]; char nowaja[10]; int i,ii; long pos, pos_now; fl_star = fopen(file_star,"r"); if(!fl_star){return 0;} fl_now = fopen(file_now,"r"); if(!fl_now){return 0;} while((k = getc(fl_star)) != EOF) { if((char)k =='@') { pos = ftell(fl_star); fseek(fl_star,(pos - 1),SEEK_SET); fgets(buf1,strlen(buf1),fl_star); i = 0; while((int)buf1[i]!=44) { staraja[i] = buf1[i]; cout<<"staraja[i]=" << staraja[i]; i++; } cout<<"\n"; while((kk = getc(fl_now)) != EOF) { if((char)kk =='@') { pos_now = ftell(fl_now); fseek(fl_now,(pos_now - 1),SEEK_SET); fgets(buf2,strlen(buf2),fl_now); ii=0; while((int)buf2[ii]!=44) { nowaja[ii] = buf2[ii]; cout<< "nowaja[ii]"<<nowaja[ii]; ii++; } cout<<"\n"; } } } } fclose(fl_star); fclose(fl_now); return 0; } |
Сообщ.
#4
,
|
|
|
Код вставлять надо между
здесь код! Так вот. Действительно, надо ставить указатель на начало файла. И покажи пожалуйса, как ты это делаешь, что у тебя все зацикливается? |
Сообщ.
#5
,
|
|
|
Цитата Это неправильно.mak8, 18.01.04, 12:46 fgets(buf1,strlen(buf1),fl_star); Цитата Это тоже.mak8, 18.01.04, 12:46 fgets(buf2,strlen(buf2),fl_now); Цитата Это можно заменить на fseek(fl_now,-1,SEEK_CUR);mak8, 18.01.04, 12:46 pos_now = ftell(fl_now); fseek(fl_now,(pos_now - 1),SEEK_SET); Цитата Это тоже. mak8, 18.01.04, 12:46 pos = ftell(fl_star); fseek(fl_star,(pos - 1),SEEK_SET); Возможно и еще что найдется при надлежащем оформлении. |
Сообщ.
#6
,
|
|
|
#include "stdafx.h" #include <iostream.h> #include <string.h> #include <stdio.h> #include <conio.h> #define star "c:\\11.txt\0" #define now "c:\\22.txt\0" int main(int argc, char* argv[]) { char file_star[20] = star; char file_now[20] = now; char buf1[512],buf2[512]; FILE *fl_star, *fl_now; int k,kk; char staraja[10]; char nowaja[10]; int i,ii; long pos, pos_now; fl_star = fopen(file_star,"r"); if(!fl_star){return 0;} fl_now = fopen(file_now,"r"); if(!fl_now){return 0;} while((k = getc(fl_star)) != EOF) { if((char)k =='@') { pos = ftell(fl_star); fseek(fl_star,(pos - 1),SEEK_SET); fgets(buf1,strlen(buf1),fl_star); i = 0; while((int)buf1[i]!=44) { staraja[i] = buf1[i]; cout<<"staraja[i]=" << staraja[i]; i++; } cout<<"\n"; while((kk = getc(fl_now)) != EOF) { if((char)kk =='@') { pos_now = ftell(fl_now); fseek(fl_now,(pos_now - 1),SEEK_SET); fgets(buf2,strlen(buf2),fl_now); ii=0; while((int)buf2[ii]!=44) { nowaja[ii] = buf2[ii]; cout<< "nowaja[ii]="<<nowaja[ii]<<"\n"; ii++; } cout<<"\n"; } } //êàê òîëüêî óñòàíàâëèâàþ íà íà÷àëî: fseek(fl_now,0,SEEK_SET); } } fclose(fl_star); fclose(fl_now); return 0; } a в цикле следущее: nowaja[ii]= nowaja[ii]= nowaja[ii]= nowaja[ii]= nowaja[ii]= nowaja[ii]= nowaja[ii]= nowaja[ii]= nowaja[ii]= nowaja[ii]= nowaja[ii]= nowaja[ii]= nowaja[ii]= nowaja[ii]= nowaja[ii]= nowaja[ii]=n nowaja[ii]=e nowaja[ii]=w nowaja[ii]=n nowaja[ii]=" nowaja[ii]= nowaja[ii]= nowaja[ii]= nowaja[ii]= nowaja[ii]= nowaja[ii]= nowaja[ii]= nowaja[ii]= nowaja[ii]= nowaja[ii]= nowaja[ii]= nowaja[ii]= nowaja[ii]= nowaja[ii]= nowaja[ii]= nowaja[ii]=n nowaja[ii]=e nowaja[ii]=w nowaja[ii]=n nowaja[ii]=" и.т.д. Добавлено в : А чего не верно? char buf1[512] FILE *fl_star fgets(buf1,strlen(buf1),fl_star); |
Сообщ.
#7
,
|
|
|
Цитата strlen - это не размер буфера, а длина строки. Во время выполнения сначала в массиве может находиться все, что угодно, соответственно strlen вернет что-то бессмысленное. Затем в последующих итерациях цикла там будет оставаться строка из предыдущей итерации. Надо писать или просто числовую константу(в Вашем случае это 512), или sizeof(имя_массива)mak8, 18.01.04, 13:17 А чего не верно? Кроме того, явно возможен выход за пределы массивов staraja и nowaja с последующим крахом если не всей системы, то программы точно. Я не понимаю смысла действий. Видимо это просто тестовая программа. Тогда что-то вроде такого: #include "stdafx.h" #include <iostream.h> #include <string.h> #include <stdio.h> #include <conio.h> #define star "c:\\11.txt\0" #define now "c:\\22.txt\0" int main(int argc, char* argv[]) { char buf1[512],buf2[512]; FILE *fl_star, *fl_now; int k,kk; char staraja[10]; char nowaja[10]; int i,ii; long pos, pos_now; fl_star = fopen(star,"r"); if(!fl_star){return 0;} fl_now = fopen(now,"r"); if(!fl_now){return 0;} while((k = getc(fl_star)) != EOF) { if(k == '@') { fseek(fl_star,-1,SEEK_CUR); fgets(buf1,sizeof(buf1),fl_star); for( i=0 ; buf1[i]!=',' ; i++ ) { cout<<"staraja[i]=" << buf1[i]<<endl; } cout<<"\n"; while((kk = getc(fl_now)) != EOF) { if((char)kk =='@') { fseek(fl_now,-1,SEEK_CUR); fgets(buf2,sizeof(buf2),fl_now); for( ii=0 ; buf2[ii]!=',' ; ii++ ) { cout<< "nowaja[ii]="<<buf2[ii]<<endl; } cout<<"\n"; } } fseek(fl_now,0,SEEK_SET); } } fclose(fl_now); fclose(fl_star); return 0; } P.S. Работоспособность не проверял, т.к. смысл некоторых действий мне не понятен. |
Сообщ.
#8
,
|
|
|
Спасибо за помощь.
Все работает. |