Вопрос № 44180: Здраствуйте уважаемые эксперты. Можно ли в Turbo C++ 3 читать из файла построчно(сразу прочитать одну строку)?Если да, то как? Заранее благодарен....Вопрос № 44201: Добрый день уважаемые эксперты.
Меня интересует создание функций с неопределенным числом переменных.
Рассмотрим для примера такую функцию:
int sprintf(
char *buffer,
const char *format,
[argument] ...
);
Как можно ...Вопрос № 44210: Здраствуйте уважаемые эксперты. У меня вопрос по Turbo C++ 3. Как в нем создаются динамические двумерные массивы?И как их удалять после завершения работы с ними? Заранее благодарен....
Вопрос № 44.180
Здраствуйте уважаемые эксперты. Можно ли в Turbo C++ 3 читать из файла построчно(сразу прочитать одну строку)?Если да, то как? Заранее благодарен.
в Turbo C++ 3 пишешь fgets, подводишь курсор на слово и жмешь ctrl-F1.
получится помощь по нужной тебе функции. в самом низу должен быть пример использования
Ответ отправил: Ramok (статус: 2-ой класс)
Ответ отправлен: 25.05.2006, 12:35
Отвечает: Селиванов Александр Владимирович
Здравствуйте, Рязанов Максим Валерьевич!
Можно, но не совсем построчно. Читается до первого пробела... ну или до конца строки, если пробелов нету... т.е. получается, что по словам...
char *fgets(char *s, int size, FILE *stream);
s -это массив типа char или указатель на строку,куда будет помещен результат ,size макс.кол-во символов(чтобы не переполнить строку) а stream- переменная типа FILE* .fgets читает символы до конца строки или файла (и в том числе сам символ конца строки).
Ф-я возвр-т указатель на считанную строку (то есть s ) в случае успеха или NULL если рпоизошла ошибка или дошел до конца ф-ла не прочитав ни 1 символа.
Пример:
char t[200],*u;
FILE * f;
f=fopen("/etc/passwd","rt");
while(!feof(f))//пока не кончится файл!
{
u=fgets(t,200,f);//читаем строку
if(u==NULL)exit(-1);..ошибка или eof
//здесь делаем что-ниб со строкой напр. печатаем на терминале:
printf("%s",t);
};
fclose(f);
//не забываемзакрыть за собой файл.
А fscanf не пойдет, она читает до первого пробела или конца строки.
Ответ отправил: Egor (статус: 3-ий класс)
Ответ отправлен: 25.05.2006, 13:46
Отвечает: Santana
Здравствуйте, Рязанов Максим Валерьевич!
Поток не пробовал?
// получем строку в буфер
infile.geline(Buffer, 250);
infile.close();
250 в данном случае масимальный размер строки, будет меньше буфер урежется
Ответ отправил: Santana (статус: 2-ой класс)
Ответ отправлен: 25.05.2006, 18:08
Отвечает: Vest
Здравствуйте, Рязанов Максим Валерьевич!
Я например сам пользуюсь библиотекой потоков, поэтому рекомендую класс: ifstream, а функция для чтения строки следующая: getline(), считывает цепочку символов до разделителя. По умолчанию которым является '
'
Vest
--------- Халявы не бывает
Ответ отправил: Vest (статус: 2-ой класс)
Ответ отправлен: 25.05.2006, 19:05
Вопрос № 44.201
Добрый день уважаемые эксперты.
Меня интересует создание функций с неопределенным числом переменных.
Рассмотрим для примера такую функцию:
int sprintf(
char *buffer,
const char *format,
[argument] ...
);
Как можно видеть данная функция имеет два указателя на строки. В buffer помещается результат. А format - это строка, в которой должны быть переработаные в тектовый вид переменные, идущее если нужно вслед за ней как третий, четвертый и т.д. параметр.
Допустим я написать полный аналог этой функции:
int myprintf(
char *buffer,
const char *format,
...
);
Как я внутри тела этой функции могу прочитать дополнительные параметры, если знаю их количество и тип, а следовательно и размер каждого передаваемого параметра, из синтаксиса передаваемой строки format.
P.S.
Приведите примеры тела такой функции, и правильного изъятия дополнительных переменных из стека в подобной ситуации.
Отправлен: 25.05.2006, 14:21
Вопрос задал: Zeitgeist (статус: 1-ый класс)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 1)
Отвечает: Ramok
Здравствуйте, Zeitgeist!
Вам необходимы макросы va_start, va_end, va_arg, va_copy.
Вот пример из ман странички.
Приложение:
Ответ отправил: Ramok (статус: 2-ой класс)
Ответ отправлен: 25.05.2006, 18:09
Отвечает: Vest
Здравствуйте, Zeitgeist!
Данный пример приводится в помощи BC++ 5.02. Идея в том, что макросами va_list и va_start ты привязываешься к первой переменной (...) и потом, просто перебираешь с помощью va_arg.
Приложение:
--------- Халявы не бывает
Ответ отправил: Vest (статус: 2-ой класс)
Ответ отправлен: 25.05.2006, 19:29
Вопрос № 44.210
Здраствуйте уважаемые эксперты. У меня вопрос по Turbo C++ 3. Как в нем создаются динамические двумерные массивы?И как их удалять после завершения работы с ними? Заранее благодарен.
Отвечает: Egor
Здравствуйте, Рязанов Максим Валерьевич!
Легко.
Пусть требуется создать массив размером x*y.
1) 1 способ.
int i,j;
int **massiv;//здесьон и будет наш массив.
massiv=(int**)malloc(x*sizeof(int*));
//создаем массив указателей на массивы содержащие строки
if(massiv==NULL) error();
for(i=0;i<x;i++)
if( massiv[i]=(int*)malloc(y*sizeof(int) ) error();
//а вот и сами строки ^
используем:
massiv[3][5]=4;
удаляем:
for(i=0;i<x;i++)
free(massiv[i]);
free(massiv);
2)этот способ работает быстрее
создаем 1мерный массив но работаем как с 2мерным!
int * massiv;
massiv=(int*)malloc(x*y*sizeof(int));
используем
присвоить эл-ту [3][7] значение 6
massiv[3*x+7]=6;
присвоить эл-ту [k][l] значение r
massiv[k*x+l]=r;
удаляем
free(massiv);
Ответ отправил: Egor (статус: 3-ий класс)
Ответ отправлен: 25.05.2006, 17:26
если коротко то никак.
но можно выделить память для одномерного массива и через указатели эмулировать
работу с двух мерным массивом
Ответ отправил: Ramok (статус: 2-ой класс)
Ответ отправлен: 25.05.2006, 18:42
Отвечает: Vest
Здравствуйте, Рязанов Максим Валерьевич!
Двумерный массив - это указатель на указатель, или же указатель на массив - идея такая же. Сначала необходимо создать этот указатель, например, int** matrix;
Затем создать массив указателей: matrix = new int*[maxCol];
и потом в каждом указателе создать массив строк:
for (int i = 0; i < maxCol; i++)
matrix[i] = new int [maxRow];
Доступ к элементам - обыкновенный matrix[i][j]
удаляем наоборот:
for (int i = 0; i < maxCol; i++)
delete [] matrix[i];
delete [] matrix;
желательно ещё всё присвоить NULL: matrix = NULL; чтобы потом ненароком не использовать.
--------- Халявы не бывает
Ответ отправил: Vest (статус: 2-ой класс)
Ответ отправлен: 25.05.2006, 19:38
Отвечает: Morgion
Здравствуйте, Рязанов Максим Валерьевич!
Дополнение к ответам.
Статический двумерный массив нельзя путать с указателем на указатель. Хотя они выглядят
и одинаково- это разные вещи. Например размещаются в памяти они по разному а
090;ак-же разный код генерируется.
Пример int a[3][3];
a[2][1]==*(a+2*3+1)
А вот при динамически выделенном int **a как двумерном массиве
a[2][1]!=*(a+2*3+1), потому что элементы могут (скорее всего) идут не подряд!
Ответ отправил: Morgion (статус: Студент)
Ответ отправлен: 26.05.2006, 09:35
Отвечает: Селиванов Александр Владимирович
Здравствуйте, Рязанов Максим Валерьевич!
покажу на примере...
допустим, нам необходимо создать динимический массив mass размера N x M челых чисел:
int **mass; // т.к. массив двумерный
mass = new int *[N]; // создали 'столбец' из N указателей на int
for(int j = 0; j < N; j++)
mass[N] = new int[M]; // создали 'строки' (они могут быть и разного размера)
delete []mass; // удаляем (какова бы не была размерность динамического массива - удаляестя всё одинаково с одними скобками)