С++: Первые шаги Mafin-а

Форум для программистов

Сообщение Mafin » Ср апр 23, 2003 4:38 pm

Господа!
Делаю первые шаги в С. Вот вам такая простенькая прога. Должна слово из файла вписать в поле, выписать его не экран и т.д. У меня выписывается только первое слово, потом все!
Не с кем посоветоватся, помогите! :?

Код: выделить все
#include <stdio.h>

#include <ctype.h>

#define MAX 10//величина поля

#define SOUBOR "slova.txt"//текстовый файл со словами



char c, pole[MAX];

int i=0;



void nulovani(void) //нулирование поля

{

   for (i=0; i<MAX; i++)

 pole[i] = 0;

}

void vypis(void) //выписка поля

{

   for (i=0; i<=MAX; i++)

 printf("%c", pole[i]);

}



int main(void)

{

   FILE* fr;   



   if ((fr = fopen(SOUBOR, "r")) ==NULL)

 printf("Soubor %s se neotevrel!n", SOUBOR);

   

   printf("Souboru "%s":n", SOUBOR);

   while ((c=getc(fr)) !=EOF) {//вписываю знаки из файла в поле

 if (c == ' ') {     //пока не дойду до пробела

    vypis();     //потом садержимое поля выпивываю

    nulovani();     //поле нулирую

    putchar('n');

    break;

 } else {

 pole[i++] = c;      

 }

   }   

   fclose(fr);

   return 0;

}
8O
<span style='color:green'>Я здесь, я везде, я всегда...</span>
Mafin
Полковник
 
Сообщений: 1585
Зарегистрирован: Пт мар 29, 2002 9:53 am
Откуда: Центральная Чехия
Пункты репутации: 0

Сообщение ssm » Ср апр 23, 2003 5:44 pm

Код: выделить все
#include <stdio.h>

#include <ctype.h>

#include <string>

#define MAX 10//величина поля

#define SOUBOR "c:temptest.txt"//текстовый файл со словами



//нулирование поля

void nulovani(char * pole){

 *pole = 0;  

}



//выписка поля

void vypis(char * pole){

 printf("%s", pole);  

}



int main(void)

{

  //зачем нам эти глобальные переменные?

  char c, pole[MAX + 1];   //зарезервируем место под нолик

  int i = 0;



  FILE* fr;    



  if ((fr = fopen(SOUBOR, "r")) ==NULL){

     printf("Soubor %s se neotevrel!n", SOUBOR);

  return -1;   //выходим нафиг

  }

   

  printf("Souboru "%s":n", SOUBOR);

  while (((c = getc(fr)) != EOF) || (i != 0)) //вписываю знаки из файла в поле

  {

  //пока не дойду до пробела

     //ну а перевод каретки?

     if ((c == ' ') || (c == 'n') || (c == EOF)) {      

  pole[i] = 0;    //закончим строку  

        vypis(pole);         //потом садержимое поля выпивываю

        nulovani(pole);      //поле нулирую

        putchar('n');       //станем на первый символ  

  i = 0;      

  if(c == EOF)

   break;

     } else if(i < MAX){

 pole[i++] = c;                  

     } else {

 printf("Скажем нет хакерам!!!n");

       vypis(pole);         //потом садержимое поля выпивываю

 nulovani(pole);      //поле нулирую  

 return -1;

  }  

  }    

  fclose(fr);

  return 0;

}



Ну а если на C++, то держи

Код: выделить все
#include <string>

#include <iostream>

#include <fstream>



int main(){

   using namespace std;

   ifstream is("c:temptest.txt");

   if(!is)

 cout << "Пардонсер, файла - нет!!!" << endl;

   

   string token;

   while(is >> token) cout << token << endl;   



   return 0;

}
матюкаться - плохо
ssm
Старшина
 
Сообщений: 46
Зарегистрирован: Ср апр 23, 2003 4:49 pm
Откуда: гоновер, германия
Пункты репутации: 0

Сообщение Mafin » Ср апр 23, 2003 7:32 pm

2ssm
Здорово получилось! <!--emo&:o-->Изображение<!--endemo-->
А у мея проблема, как видишь, избегаю пользоваться указателями! Столько литературы перечитал, а так толком и не смог себе представить, как ими пользоваться. Хотя сам понимаю, что инструмент они силный!
Как вылечится, не подскажешь??? :?
<span style='color:green'>Я здесь, я везде, я всегда...</span>
Mafin
Полковник
 
Сообщений: 1585
Зарегистрирован: Пт мар 29, 2002 9:53 am
Откуда: Центральная Чехия
Пункты репутации: 0

Сообщение MAPA3bM » Чт апр 24, 2003 2:38 am

2Mafin
Я те могу один совет дать - выучи assembler..я сишные указатели имено через него и понимал <!--emo&;)-->Изображение<!--endemo-->
MAPA3bM
Полковник
 
Сообщений: 1270
Зарегистрирован: Вт дек 31, 2002 12:54 am
Откуда: Приморье
Пункты репутации: 0

Сообщение ssm » Чт апр 24, 2003 12:48 pm

2MAPA3bM

Я те могу один совет дать - выучи assembler..я сишные указатели имено через него и понимал


IMHO гораздо проще с пониманием указателя учить assembler
матюкаться - плохо
ssm
Старшина
 
Сообщений: 46
Зарегистрирован: Ср апр 23, 2003 4:49 pm
Откуда: гоновер, германия
Пункты репутации: 0

Сообщение Mafin » Пт апр 25, 2003 1:08 pm

2All
Но, все-таки, Гопода, дайте полезный совет!
КАК ПОБОРОТЬ УКАЗАТЕЛИ??? :cry:

2модератор
Забавно переименовали тему! <!--emo&:D-->Изображение<!--endemo-->
fromмодератор Намана <!--emo&:)-->Изображение<!--endemo-->
Последний раз редактировалось Mafin Чт май 08, 2003 10:47 pm, всего редактировалось 1 раз.
<span style='color:green'>Я здесь, я везде, я всегда...</span>
Mafin
Полковник
 
Сообщений: 1585
Зарегистрирован: Пт мар 29, 2002 9:53 am
Откуда: Центральная Чехия
Пункты репутации: 0

Сообщение ssm » Вт май 06, 2003 4:46 pm

2Mafin
Хороший учебник + практика

ЗЫЫ Пивом разбавлять в строгой пропорции!!!
матюкаться - плохо
ssm
Старшина
 
Сообщений: 46
Зарегистрирован: Ср апр 23, 2003 4:49 pm
Откуда: гоновер, германия
Пункты репутации: 0

Сообщение dAnIK SeNT » Вт май 06, 2003 6:56 pm

2Mafin
Что тебе конкретно непонятно? Скажи, может я объясню <!--emo&:)-->Изображение<!--endemo-->.
Ассемблер знать не обязательно, но представлять себе хотя бы в общих чертах как работает процессор на низком уровне надо. Так гораздо легче.
Последний раз редактировалось dAnIK SeNT Чт май 08, 2003 10:50 pm, всего редактировалось 1 раз.
яНЯЕД ОН СОПЪФЙЕ: Athlon 64 X2 5200+ @2,86GHz / nF 570 SLI (ASUS M2N SLI Deluxe) / 4 Gb RAM (4x1Gb Kingston) / 2,9Tb SATAII (0,50+0,64+0,75+1,00Tb WD) / ASUS 8800 GTS512 / 2x NEC-Optiarc AD-7173 / Thermaltake ToughPower 650W / 2x30W Microlab Solo-2 / 20" LCD Benq FP202W (wide) / openSUSE 11.1 / KDE 4.2.1
<!--coloro:Navy--><span style="color:Navy"><!--/coloro-->оН БЯЕЛ БНОПНЯЮЛ - Б email. б ICQ ОНЪБКЪЧЯЭ ПЮГ Б ОНКЦНДЮ.<!--colorc--></span><!--/colorc-->
dAnIK SeNT
Маршал
 
Сообщений: 5101
Зарегистрирован: Чт мар 28, 2002 7:48 pm
Откуда: яяяп
Пункты репутации: 0

Сообщение Scalder » Ср май 07, 2003 5:17 am

2Mafin
Очень просто это обьясняеться на progs.ru - попробуй <!--emo&:)-->Изображение<!--endemo-->
<!--coloro:green--><span style="color:green"><!--/coloro-->А что я не так сказал?<!--colorc--></span><!--/colorc-->
<!--coloro:red--><span style="color:red"><!--/coloro-->А ты как думал? Конечно это ИМХО<!--colorc--></span><!--/colorc-->

<!--coloro:red--><span style="color:red"><!--/coloro-->>В каждом системном администраторе есть что-то от Бога.<!--colorc--></span><!--/colorc-->
В каждом программисте есть что-то от Бога для Бога. :-р
<a href="http://www.erepublik.com/en/referrer/mrScalder" target="_blank">Изображение</a>
Scalder
Генерал-майор
 
Сообщений: 2587
Зарегистрирован: Пн апр 08, 2002 10:21 am
Пункты репутации: 0

Сообщение Mafin » Ср май 07, 2003 9:59 am

2Scalder
progs.ru? Тама какое-то интернет агенство... <!--emo&:huh:-->Изображение<!--endemo-->

2dAnIK SeNT
Как работать с указателями и полем, структурами мне понятно. Но вот указатель на функцию, ф-ия возвращающая ук., ук. на ук.!!! Здеся я уж че-то терятся начинаю... Просто наглядности нету... не могу себе этот процесс в башке представить - вот в чем вся фиша!!! <!--emo&:(-->Изображение<!--endemo-->

<span style='font-size:21pt;line-height:100%'><span style='color:red'>HELP!!!</span></span> <!--emo&:blink:-->Изображение<!--endemo-->
Последний раз редактировалось Mafin Ср май 07, 2003 10:01 am, всего редактировалось 1 раз.
<span style='color:green'>Я здесь, я везде, я всегда...</span>
Mafin
Полковник
 
Сообщений: 1585
Зарегистрирован: Пт мар 29, 2002 9:53 am
Откуда: Центральная Чехия
Пункты репутации: 0

Сообщение dAnIK SeNT » Пт май 09, 2003 4:02 am

Не знаю, что тебе уже известно, поэтому начну издалека. Попробую изложить низкоуровневые основы. Терминология никуда не годится, не все здесь точно, но, имхо, так понятнее.
У компа есть память <!--emo&:)-->Изображение<!--endemo-->. У каждого байта памяти есть свой собственный адрес. Байт - это мельчайший адресуемый элемент, т.е. ты не можешь обратиться к отдельному биту памяти - чтобы считать бит памяти, тебе надо считать целый байт, и выделить из него нужный бит.
Нынче память имеет линейную структуру, т.е. каждому байту памяти соответствует 4-байтовое число - его адрес.
Существуют различные типы адресации, т.е. метода обращения процессора к памяти. Нас интересует два - прямая и косвенная адресация. Прямая адресация - это когда команда записана в виде "скопировать байт по адресу A в ячейку B", где A и B - адреса. Занимать такая команда в машинном коде будет скорее всего 9 байт - 1 байт - собственно, команда "скопировать" - MOV (команда одна из базовых, потому занимает немного), 8 байт - два адреса. Когда ты записываешь
Код: выделить все
a=b;

то это как раз преобразуется в машинную команду такого типа.
Косвенная адресация - хитрее. Когда ты пишешь на Си
Код: выделить все
*a=*b;

то это преобразуется в команду типа "скопировать содержимое из ячейки по адресу, который хранится в ячейке по адресу A, в ячейку по адресу, который хранится по адресу B". Команда будет занимать столько же байт, как и в прошлой там будет два адреса. Но процессор будет выполнять эту команду хитрее: Он пойдет по адресу A, возьмет 4 байта начиная с этого адреса, интерпретирует эти 4 байт как адрес, по которому лежат интересующие нас данные. Аналогично с B - участок памяти, над которым надо произвести операцию, находится по адресу, который записан в памяти по адресу B.
Значения A и B являются указателями. Указатель - это и есть 4 байта в памяти, в которых хранится адрес интересующих нас данных. Фраза "A указывает на B" эквивалентна фразе "A содержит адрес B".
Но это на низком уровне. Ведь А и В - это адреса, возникает вопрос - как связать адреса с именами переменных? Ведь на высоком уровне мы практически не используем явное задание адресов памяти? Все очень просто. Компилятор все имена переменных преобразует в адреса. Каждая переменная - это на самом деле просто адрес первого байта какой-то структуры в памяти. Если переменная - указатель, то это адрес 4 байт памяти, в которых хранится другой адрес.
Указатель на функцию - это переменная, хранящая адрес первой команды какой-то функции в памяти. Можно передать управление по этому адресу - "вызвать функцию".
яНЯЕД ОН СОПЪФЙЕ: Athlon 64 X2 5200+ @2,86GHz / nF 570 SLI (ASUS M2N SLI Deluxe) / 4 Gb RAM (4x1Gb Kingston) / 2,9Tb SATAII (0,50+0,64+0,75+1,00Tb WD) / ASUS 8800 GTS512 / 2x NEC-Optiarc AD-7173 / Thermaltake ToughPower 650W / 2x30W Microlab Solo-2 / 20" LCD Benq FP202W (wide) / openSUSE 11.1 / KDE 4.2.1
<!--coloro:Navy--><span style="color:Navy"><!--/coloro-->оН БЯЕЛ БНОПНЯЮЛ - Б email. б ICQ ОНЪБКЪЧЯЭ ПЮГ Б ОНКЦНДЮ.<!--colorc--></span><!--/colorc-->
dAnIK SeNT
Маршал
 
Сообщений: 5101
Зарегистрирован: Чт мар 28, 2002 7:48 pm
Откуда: яяяп
Пункты репутации: 0

Сообщение Mafin » Пт май 09, 2003 6:59 am

2All
<span style='color:red'><span style='font-size:14pt;line-height:100%'>С праздником Победы, дорогие товарищи!!!</span></span> <!--emo&:D-->Изображение<!--endemo-->

2dAnIK SeNT
Спасибо за пояснение! Т.е. имея ук. на переменную, и изменив содержание адреса, на который указывает ук., мы тем самым изменяем саму переменную? <!--emo&:huh:-->Изображение<!--endemo-->
Если я правильно понял, то смысл ук. в том, что мы не гоняем по памяти всякого рода значения, не переписываем переменные, а всего лиш переводим ук. с одного участка памяти на другой?! <!--emo&:unsure:-->Изображение<!--endemo-->
<span style='color:green'>Я здесь, я везде, я всегда...</span>
Mafin
Полковник
 
Сообщений: 1585
Зарегистрирован: Пт мар 29, 2002 9:53 am
Откуда: Центральная Чехия
Пункты репутации: 0

Сообщение Scalder » Сб май 10, 2003 4:58 am

2Mafin
упс. адрес <a href='http://progs.biz/' target='_blank'>http://progs.biz/</a>
<!--coloro:green--><span style="color:green"><!--/coloro-->А что я не так сказал?<!--colorc--></span><!--/colorc-->
<!--coloro:red--><span style="color:red"><!--/coloro-->А ты как думал? Конечно это ИМХО<!--colorc--></span><!--/colorc-->

<!--coloro:red--><span style="color:red"><!--/coloro-->>В каждом системном администраторе есть что-то от Бога.<!--colorc--></span><!--/colorc-->
В каждом программисте есть что-то от Бога для Бога. :-р
<a href="http://www.erepublik.com/en/referrer/mrScalder" target="_blank">Изображение</a>
Scalder
Генерал-майор
 
Сообщений: 2587
Зарегистрирован: Пн апр 08, 2002 10:21 am
Пункты репутации: 0

Сообщение Mafin » Сб май 10, 2003 9:11 am

2Scalder
Вот спасибо-хрошо!!! Какой правильный сайтик! <!--emo&;)-->Изображение<!--endemo-->

Да, кстати, вчера наконец-то разгрыз указатели и структуры! Не таким уж теперь мне С устрашающим языком кажется! <!--emo&:D-->Изображение<!--endemo-->
Ну, вот, а теперь буду докучать другими вопросами! Но потом! <!--emo&B)-->Изображение<!--endemo-->
<span style='color:green'>Я здесь, я везде, я всегда...</span>
Mafin
Полковник
 
Сообщений: 1585
Зарегистрирован: Пт мар 29, 2002 9:53 am
Откуда: Центральная Чехия
Пункты репутации: 0

Сообщение Mafin » Вс май 18, 2003 3:38 pm

Господа!
Удалось побороть С, но обстоятельства, не дав возможности попрактиковаться, заставляют заняться С++. Честно признаюсь, что пока мне все дается намного легче, чем это было при первых шагах в С, но сие и понятно. <!--emo&:)-->Изображение<!--endemo-->
Но, вот вопрос, объясните, плииз, на примере, к чему перегружать операторы. Может я не правильно перевел термин, но это от того, что лит-ра вся на чешском. <!--emo&<_<-->Изображение<!--endemo-->
Короче, хелп, плииз! <!--emo&:unsure:-->Изображение<!--endemo-->
<span style='color:green'>Я здесь, я везде, я всегда...</span>
Mafin
Полковник
 
Сообщений: 1585
Зарегистрирован: Пт мар 29, 2002 9:53 am
Откуда: Центральная Чехия
Пункты репутации: 0

След.

Вернуться в Программирование

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

cron