Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> структуры 
:(
    Опции темы
pharrell
Дата 18.7.2006, 23:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 27.6.2006

Репутация: нет
Всего: нет



Здравствуйте.Вот код.В принципе он работает.Вот только как все это переписать на чистом Си.Да прогрмма считывает строки из файла в структуру.Поля структуры в строке отделяются запятыми,но читается только одна строка а нужно чтобы все в файле.Заранее больше спасибо.
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

struct STRING
{
  string str1, str2, str3, str4, str5;
};

void main()
{
  ifstream fin;
  fin.open("text.txt",ios_base::in);
  if ( !fin.is_open() ) return;

  STRING str;
  getline(fin,str.str1,','); // считывам
  getline(fin,str.str2,',');
  getline(fin,str.str3,',');
  getline(fin,str.str4,',');
  getline(fin,str.str5,'\n');

  cin.get();
} 
PM MAIL   Вверх
tigger
Дата 19.7.2006, 04:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 456
Регистрация: 30.4.2005

Репутация: нет
Всего: 4



У тебя читаются все строки в str1, для того чтобы читались все строки по отдельности str1..str5 файл text.txt должен быть вида:


привет,
пока,
ушел,
пришел,
нафиг


т.е строки заканчиваться твоим символом разделителем. 


--------------------
user posted image
PM MAIL   Вверх
Oleg_Ci
Дата 19.7.2006, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Friend
**


Профиль
Группа: Участник
Сообщений: 485
Регистрация: 28.5.2006
Где: Новосиб.обл.

Репутация: 3
Всего: 30



Код

#include <stdio.h>
#define max 50   // 50 символов в строке

struct STRING
{
  char ch[5][max];  // впинцыпе и ненужна структура
};

void GetSruct( FILE*, struct STRING[], int );
void ReadString( FILE*, char*, char);

int main(int argc, char* argv[])
{
  FILE *file;
  file = fopen("text.txt","r");
  if (file==NULL) return 0;

  STRING str[3];    // три структуры 
  GetSruct(file,str,3);
  int i,j;

  for ( i=0; i<3; i++ )
    for ( j=0; j<5; j++ )
      printf("%s%s",str[i].ch[j],"\n");

  getchar();
  return 0;
}

void GetSruct( FILE * file, struct STRING str[], int size )
{ // считывает словa из файла в структуры
  int j,i;
  for ( j=0; j<size; j++ )
    for ( i=0; i<5; i++ )
      ReadString( file, str[j].ch[i], ',' );
}

void ReadString( FILE* file, char* ch, char end)
{ // считывам из файла символы до символа end или перевода строки '\n'
  int i=0;
  while(ch[i]=fgetc(file))
    if (ch[i]==EOF || ch[i]==end || ch[i]=='\n' || ++i>max ) break;
  ch[i]='\0';
}
 
PM MAIL   Вверх
apook
Дата 23.7.2006, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 794
Регистрация: 12.7.2006

Репутация: 9
Всего: 23



А вот как тот код мог выглядеть на чистом Си. Независимо от того какого вида файл после символа разделителя заполняется следующщее поле структуры.

Код

#include "stdio.h"
#include "string.h"


struct {
        char str1[80], str2[80], str3[80], str4[80], str5[80];
            } str;

// -  -  -  -  -  -  -  -  -  -  --


int main()
{

FILE *f_input;             // указатели на файлы
int  i, c, q;

char inputfile[50], string[80], ch;
strcpy(inputfile, "text.txt");


if ((f_input = fopen(inputfile, "r")) == NULL) // открытие файла
    { // с ошибкой
      perror("Error");
      printf("NOT open %s input_filename\n", inputfile);
         }

else //ошибок нет!(файл открыт)
    {
     fseek(f_input, 0, SEEK_SET); /* позиционирование в начало файла */

     i = 0;
     q = 0;  
     do
          {
           ch = fgetc(f_input);

           if (ch == ',' || ch == '\0' || ch == '\n')
                {//встритил сммвол разделитель или символ конца строки
                 string[i] = '\0';
                 //знесем в структуру
                 if (q == 0) strcpy(str.str1, string);
                 else if (q == 1) strcpy(str.str2, string);
                 else if (q == 2) strcpy(str.str3, string);
                 else if (q == 3) strcpy(str.str4, string);
                 else if (q == 4)
                       { //означает что заполняется последнее 5-ое поле структуры
                        strcpy(str.str5, string);
                        break; //значит покидаем цикл
                             }
                 c = 0;
                 while(c < strlen(string)) //уничтожается содержимое string
                      {
                       string[c] = '\0';
                       c++;
                           }
                 i = 0; //читать в string будем с нуля
                 q++; 
                      }
           else
                {
                 string[i] = ch;
                 i++;
                     } 

                }  while (ch != EOF);

           fclose(f_input);
    
           //и результат
           printf("%s\n%s\n%s\n%s\n%s\n", str.str1, str.str2, str.str3, str.str4, str.str5);


         } //

return 0;
    }
   

Это сообщение отредактировал(а) apook - 23.7.2006, 08:55


--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
Oleg_Ci
Дата 23.7.2006, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Friend
**


Профиль
Группа: Участник
Сообщений: 485
Регистрация: 28.5.2006
Где: Новосиб.обл.

Репутация: 3
Всего: 30



Так попроще. smile apook не думай что тебя я учить взялся, сам учусь ещё...
Код

#include "stdio.h"
#include "string.h"
#define max 80  // 80 символов в строках

struct {
        char str1[max], str2[max], str3[max], str4[max], str5[max];
        } str;
// -  -  -  -  -  -  -  -  -  -  --
int main()
{
FILE *f_input;             // указатели на файлы
int  i, q;
char inputfile[50], string[max];
strcpy(inputfile, "text.txt");
if ((f_input = fopen(inputfile, "r")) == NULL) // открытие файла    
    { // с ошибкой
      perror("Error");    
      printf("NOT open %s input_filename\n", inputfile);
      getchar();
      return 0;
    }
//ошибок нет!(файл открыт)
     fseek(f_input, 0, SEEK_SET); /* позиционирование в начало файла */    

    i = 0;
     q = 0;
     while ((string[i] = fgetc(f_input))!=EOF)
          {
           if (string[i] == ',' || string[i] == '\n')
                {//встрeтил смвол разделитель или символ конца строки
                 string[i] = '\0';
                 //знесем в структуру    
                 if (q == 0) strcpy(str.str1, string);
                 else if (q == 1) strcpy(str.str2, string);
                 else if (q == 2) strcpy(str.str3, string);
                 else if (q == 3) strcpy(str.str4, string);
                 else if (q == 4)    
                       { //означает что заполняется последнее 5-ое поле структуры    
                        strcpy(str.str5, string);
                        break; //значит покидаем цикл    
                        }
                 i = 0; //читать в string будем с нуля
                 q++;    
                 }  
           else  i++; // end if
          } // end while

           //и результат
           printf("%s\n%s\n%s\n%s\n%s\n", str.str1, str.str2, str.str3, str.str4, str.str5);

fclose(f_input);
getchar();
return 0;    
    }
или ещё проще
Код

#include <stdio.h>
#include <stdlib.h>

struct {
        char *str1, *str2, *str3, *str4, *str5;
        } str;
// -  -  -  -  -  -  -  -  -  -  --
int main()
{
int  i, q=0;
char *pt[5];

for ( i=0; i<5; i++ )
  pt[i] = (char*)calloc(80, sizeof(char)); // на 80 символов
str.str1=pt[0];
str.str2=pt[1];
str.str3=pt[2];
str.str4=pt[3];
str.str5=pt[4];

FILE *f_input;             // указатели на файлы
if ((f_input = fopen("text.txt", "r")) == NULL) // открытие файла
    { // с ошибкой
      perror("Error");
      printf("NOT open %s input_filename\n", "text.txt");
      system("pause");
      return 0;
    }

//  собственно цикл считывания из файла_________________________________
  
  for ( i=0;(pt[q][i] = fgetc(f_input))!=EOF; i++)
    if (pt[q][i] == ',' || pt[q][i] == '\n')
    {//встрeтил смвол разделитель или символ конца строки
      pt[q][i] = '\0';
      i = -1;
      if (q++ == 4) break;
    }

//  и результат_______________________________________________________
printf("%s\n%s\n%s\n%s\n%s\n", str.str1, str.str2, str.str3, str.str4, str.str5);

for ( i=0; i<5; i++ )
  free(pt[i]);

fclose(f_input);
system("pause");
return 0;    
    }
 
PM MAIL   Вверх
apook
Дата 23.7.2006, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 794
Регистрация: 12.7.2006

Репутация: 9
Всего: 23



Проще или понятней? Однако кто вообще не врубается легче поймет
мой код (по себе сужу) . А вообще конечно неплохо. smile  

Это сообщение отредактировал(а) apook - 23.7.2006, 14:42


--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
apook
Дата 23.7.2006, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 794
Регистрация: 12.7.2006

Репутация: 9
Всего: 23



А вот еще небезызвестная функция по модному написанная


Код


#include <string.h>

size_t strlen(const char *s)
{
  const char *ss = s;
  while ( *ss )
    ss++;
  return ss-s;
}



Но мне больше нравится самопал типа:

Код


int strlen(char s[])
{
int n;
n = 0;
while(s[n] != '\0' || s[n] != '\n')
     {
      n++;
          }

return n;
     }




или такой pause();


Код


void pause()
{
  printf("\nPress any key to continue");

  asm{
    mov ah,7
    int 0x21
    }
  printf("\r                          \r");
}




или такой clrscr();


Код


void clrscr()      /* простейший clear scrin */
{
  asm{
    mov ax,3h         /*Clear screen or put it in TextMode*/
    int 10h
        }
    }

 

и т.д. Один минус не совсем уверен что все всегда будет работать
(Маловато знаний)

 

Это сообщение отредактировал(а) apook - 23.7.2006, 16:01


--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
Damarus
Дата 23.7.2006, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

Репутация: 6
Всего: 29



apook, это ты к чему smile  
PM MAIL ICQ Jabber   Вверх
Oleg_Ci
Дата 23.7.2006, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Friend
**


Профиль
Группа: Участник
Сообщений: 485
Регистрация: 28.5.2006
Где: Новосиб.обл.

Репутация: 3
Всего: 30



pause()  и  clrscr()   у меня не работают, останавливаются оба на int 0x21  . Программирую на Borland C++ Builder 6. А вариант strlen мне такой нравится :
Код

size_t strlen2(const char *s)
{
  const char *ss = s;
  while ( *++ss );
  return ss-s;
}
А особенно вот это копирование нравиться, маленькое очень:
Код

void strcpy(char *s, char *t)
{
    while (*s++ = *t++);
}
 
Цитата
apook, это ты к чему
Ну не всёже время писать программки, поприкалыватья тоже надо. smile  Тем-более задача уже решёная, аpharrell здесь не показывается, топик заброшен уже...  чё здесь делать остаётся ? 

Это сообщение отредактировал(а) Олег4 - 23.7.2006, 17:10
PM MAIL   Вверх
apook
Дата 24.7.2006, 03:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 794
Регистрация: 12.7.2006

Репутация: 9
Всего: 23



Цитата

apook, это ты к чему


К тому что любят на подобных форумах на вопрос типа 'помогите разоб
раться' предлагать готовые проги в профессиональном стиле

Цитата

pause()  и  clrscr()   у меня не работают, останавливаются оба на int 0x21  . 


функцию pause() я позаимствовал из одного исходника никому не изве
стной программы под названмем fdisk (freedos) clrscr правда сам придумал
когда не хотел подключать conio.h чтоб не увеличивать размер проги
Но все как наверно понятно эксперимента ради.

Цитата

Программирую на Borland C++ Builder 6
 

Я гружусь по Borland Turbo C++ , хотя однако и на  Builder 6 работало,
сейчас попробую...
 


--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
Damarus
Дата 24.7.2006, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

Репутация: 6
Всего: 29



Цитата(Олег4 @  23.7.2006,  17:58 Найти цитируемый пост)
pause()  и  clrscr()   у меня не работают, останавливаются оба на int 0x21  . Программирую на Borland C++ Builder 6.


Цитата(apook @  24.7.2006,  04:39 Найти цитируемый пост)
Я гружусь по Borland Turbo C++ , хотя однако и на  Builder 6 работало,сейчас попробую...


int 0x21, равно как и int 0x10 в NT системах работать не будет, т.к. доступ к прерываниям там возможен только из ring0, а int 0x21 там вообще нет.

Цитата(apook @  24.7.2006,  04:39 Найти цитируемый пост)
К тому что любят на подобных форумах на вопрос типа 'помогите разобраться' предлагать готовые проги в профессиональном стиле


Чем плох профессиональный стиль smile 
 
PM MAIL ICQ Jabber   Вверх
apook
Дата 24.7.2006, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 794
Регистрация: 12.7.2006

Репутация: 9
Всего: 23



Привычка у профессионалов обьяснить чтоб никто ниче не понял 


--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0546 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.