Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > структуры


Автор: pharrell 18.7.2006, 23:58
Здравствуйте.Вот код.В принципе он работает.Вот только как все это переписать на чистом Си.Да прогрмма считывает строки из файла в структуру.Поля структуры в строке отделяются запятыми,но читается только одна строка а нужно чтобы все в файле.Заранее больше спасибо.
#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();
} 

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


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


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

Автор: Oleg_Ci 19.7.2006, 19:00
Код

#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';
}
 

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

Код

#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;
    }
   

Автор: Oleg_Ci 23.7.2006, 13:04
Так попроще. 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;    
    }
 

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

Автор: apook 23.7.2006, 15:59
А вот еще небезызвестная функция по модному написанная


Код


#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
        }
    }

 

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

 

Автор: Damarus 23.7.2006, 16:41
apook, это ты к чему smile  

Автор: Oleg_Ci 23.7.2006, 16:58
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 здесь не показывается, топик заброшен уже...  чё здесь делать остаётся ? 

Автор: apook 24.7.2006, 03:39
Цитата

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


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

Цитата

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


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

Цитата

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

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

Автор: Damarus 24.7.2006, 09:47
Цитата(Олег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 
 

Автор: apook 24.7.2006, 10:33
Привычка у профессионалов обьяснить чтоб никто ниче не понял 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)