Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 422
от 30.05.2006, 17:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 330, Экспертов: 42
В номере:Вопросов: 3, Ответов: 12


Вопрос № 44180: Здраствуйте уважаемые эксперты. Можно ли в Turbo C++ 3 читать из файла построчно(сразу прочитать одну строку)?Если да, то как? Заранее благодарен....
Вопрос № 44201: Добрый день уважаемые эксперты. Меня интересует создание функций с неопределенным числом переменных. Рассмотрим для примера такую функцию: int sprintf( char *buffer, const char *format, [argument] ... ); Как можно ...
Вопрос № 44210: Здраствуйте уважаемые эксперты. У меня вопрос по Turbo C++ 3. Как в нем создаются динамические двумерные массивы?И как их удалять после завершения работы с ними? Заранее благодарен....

Вопрос № 44.180
Здраствуйте уважаемые эксперты. Можно ли в Turbo C++ 3 читать из файла построчно(сразу прочитать одну строку)?Если да, то как? Заранее благодарен.
Отправлен: 25.05.2006, 10:13
Вопрос задал: Рязанов Максим Валерьевич (статус: Посетитель)
Всего ответов: 5
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Ramok
Здравствуйте, Рязанов Максим Валерьевич!

в Turbo C++ 3 пишешь fgets, подводишь курсор на слово и жмешь ctrl-F1.
получится помощь по нужной тебе функции. в самом низу должен быть пример использования
Ответ отправил: Ramok (статус: 2-ой класс)
Ответ отправлен: 25.05.2006, 12:35

Отвечает: Селиванов Александр Владимирович
Здравствуйте, Рязанов Максим Валерьевич!

Можно, но не совсем построчно. Читается до первого пробела... ну или до конца строки, если пробелов нету... т.е. получается, что по словам...

fscanf(FILE *fp, "%s", char *str);
Ответ отправил: Селиванов Александр Владимирович (статус: 2-ой класс)
Ответ отправлен: 25.05.2006, 12:54

Отвечает: Egor
Здравствуйте, Рязанов Максим Валерьевич!
SYNOPSIS
#include <stdio.h>

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
Здравствуйте, Рязанов Максим Валерьевич!
Поток не пробовал?

//буфер для приема строки
char Buffer[250] ;

// открываем файло
ifstream infile("anyfile.txt");

// получем строку в буфер
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. Как в нем создаются динамические двумерные массивы?И как их удалять после завершения работы с ними? Заранее благодарен.
Отправлен: 25.05.2006, 16:09
Вопрос задал: Рязанов Максим Валерьевич (статус: Посетитель)
Всего ответов: 5
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: 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
Здравствуйте, Рязанов Максим Валерьевич!

если коротко то никак.
но можно выделить память для одномерного массива и через указатели эмулировать
работу с двух мерным массивом
Ответ отправил: 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; // удаляем (какова бы не была размерность динамического массива - удаляестя всё одинаково с одними скобками)
Ответ отправил: Селиванов Александр Владимирович (статус: 2-ой класс)
Ответ отправлен: 27.05.2006, 09:38


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.33 от 25.05.2006
Яндекс Rambler's Top100

В избранное