1

Тема: Переробити із С++ на С

Цей код написаний в VStudio2010 на С + +. У мене Code Blocks його не компілює, знаходить кілька помилок. Але мені потрібно, що б це було написано на Сі. Самому переробити не виходить, з функціями не можу розібратися. Допоможіть будь ласка!!

#include <fstream>
#include <iostream>
#include<string>
using namespace std;


    typedef struct
    {
       char avtor[20];
       char nazvanie[30];
       char izdatelstvo[40];
       char janr[10];
       int stranici;
    }biblioteka;

    int i,n;

    fstream fp;

    biblioteka books[20];

void getinfo(string name, biblioteka *);
void viewinfo(int num,const biblioteka *);

int main()
{
    setlocale( LC_ALL,"Russian" );


    getinfo("baza.dat",books);
    viewinfo(n,books);

    cout<<endl<<endl;

}

void getinfo(string name,biblioteka *)
{
    i=n=0;

    fp.open(name,ios::in);


    if (!fp) return;

    while (!fp.eof())
    {
        n=i+1;
        fp>>books[n].avtor;
        fp>>books[n].nazvanie;
        fp>>books[n].izdatelstvo;
        fp>>books[n].janr;
        fp>>books[n].stranici;

        i++;
    }

    fp.close();
}


void viewinfo(int num, const struct biblioteka *)
{
    for(i=1;i<num;i++)
        printf("%s %s %s %s %d\n",books[i].avtor, books[i].nazvanie, books[i].izdatelstvo, books[i].janr, books[i].stranici);
 }

2

Re: Переробити із С++ на С

А у чому у вас проблеми? Можливо буде простіше самому написати подібну програму на C, якщо є завдання, а не пероблювати.

Подякували: koala1

3

Re: Переробити із С++ на С

Шлях 1: переробка

Перше виправіть помилки у коді, щоб його кодеблокс (сподіваюся, компілятором С++, а не чистим сішним волає) нормально пропустив. А тоді переводьте на сі.

Шлях 2: самому з нуля
Replace написав:

А у чому у вас проблеми? Можливо буде простіше самому написати подібну програму на C, якщо є завдання, а не пероблювати.

:)

4

Re: Переробити із С++ на С

Річ у тому, що я не можу розібратися, як на мові С через функції передавати структури. Знайомий написав ций код на с++, а я не знаю, як на с переробити, бо не знаю, як розібратися із функціями, багато помилок постійно видає

5

Re: Переробити із С++ на С

Структури передавати варто за адресою (покажчиками). Від хрестів там тільки й того, що виведення інфи та файлові операції.

6

Re: Переробити із С++ на С

Bartash написав:

Структури передавати варто за адресою (покажчиками). Від хрестів там тільки й того, що виведення інфи та файлові операції.

Ось мій початковий код. Можете допомогти його розбити на 2 функції? Я вже декілька тижнів мучаюсь з ним

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<string.h>
#include<windows.h>
#include<locale.h> /* Для русского языка */


typedef struct _biblioteka{
        char avtor[20];
        char nazvanie[30];
        char izdatelstvo[40];
        char janr[10];
        int stranici;
    }biblioteka;
int main()
{
    setlocale( LC_ALL,"Russian" );
    int i=0,n;
    FILE *fp;
    struct _biblioteka *biblioteka=(struct _biblioteka *)malloc(sizeof(struct _biblioteka));//память под одну структуру
    if ((fp = fopen("baza.dat","r")) == NULL) { perror("baza.dat") ; getch();return 1; }
    while (!feof(fp))  /*feof() проверяет, достигнут ли конец файла */
        {
        n=i+1;
        biblioteka = realloc(biblioteka,sizeof(struct _biblioteka)*(n+1));
        fscanf(fp,"%s %s %s %s %d",&biblioteka[i].avtor, &biblioteka[i].nazvanie, &biblioteka[i].izdatelstvo, &biblioteka[i].janr, &biblioteka[i].stranici);
        i++;
        }
    fclose(fp);
    for(i=0;i<n;i++)
        printf("%s %s %s %s %d\n",biblioteka[i].avtor, biblioteka[i].nazvanie, biblioteka[i].izdatelstvo, biblioteka[i].janr, biblioteka[i].stranici);
    for(i=0;i<n;i++)
        free(biblioteka);
    return 0;
    getch();
}

Зазделегіть дякую

7

Re: Переробити із С++ на С

Якщо просто розкидати - це як два байти на асфальт:

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<string.h>
#include<windows.h>
#include<locale.h> /* Для русского языка */
 
 
typedef struct _biblioteka{
        char avtor[20];
        char nazvanie[30];
        char izdatelstvo[40];
        char janr[10];
        int stranici;
    }biblioteka;

int i=0,n;

int writeToFile()
{
FILE *fp;
    struct _biblioteka *biblioteka=(struct _biblioteka *)malloc(sizeof(struct _biblioteka));//память под одну структуру
    if ((fp = fopen("baza.dat","r")) == NULL) { perror("baza.dat") ; getch();return 1; }
    while (!feof(fp))  /*feof() проверяет, достигнут ли конец файла */
        {
        n=i+1;
        biblioteka = realloc(biblioteka,sizeof(struct _biblioteka)*(n+1));
        fscanf(fp,"%s %s %s %s %d",&biblioteka[i].avtor, &biblioteka[i].nazvanie, &biblioteka[i].izdatelstvo, &biblioteka[i].janr, &biblioteka[i].stranici);
        i++;
        }
    fclose(fp);
    return 0;
}

void printData()
{   
    for(i=0;i<n;i++)
        printf("%s %s %s %s %d\n",biblioteka[i].avtor, biblioteka[i].nazvanie, biblioteka[i].izdatelstvo, biblioteka[i].janr, biblioteka[i].stranici);
    for(i=0;i<n;i++)
        free(biblioteka);
}

int main()
{
    setlocale( LC_ALL,"Russian" );
   if(! writeToFile())
       printData();
   else
       return 1;

    getch();
    return 0;
}

Але так код загалом не варто ваяти: погана практика.

8

Re: Переробити із С++ на С

Я вам дуже вдячний!!
Ось тільки компілятор видає 2 помилки в функції printData "expected expression before 'biblioteka'", що з ними робити?

9

Re: Переробити із С++ на С

Пане tsarik.vlad, а вам не важко буде викласти один з варіантів того, як ви мучаєтеся? Варіант bartash взагалі некоректний з кількох причин.

10

Re: Переробити із С++ на С

Я намагався шукати приклади в інтернеті, ось тут я намагався зробити функцію зчитування з файла структури:

#include <stdio.h> 
#include <stdlib.h> 
 
typedef struct {
        char avtor[20];
        char nazvanie[30];
        char izdatelstvo[40];
        char janr[10];
        int stranici;}
_biblioteka;
void skan(int, char *, char *, char *, char *, int *);
int main ()
{
FILE *fp;
int n=0,i;
char result_sting[300];
if ((fp = fopen("baza.dat","r")) == NULL) { perror("baza.dat") ; getch(); }
while(fgets(result_sting,sizeof(result_sting),fp))
    n++;
_biblioteka *biblioteka[n];
for(i=0; i < n; i++)
if (( biblioteka[i] = (_biblioteka *) calloc(1, sizeof(_biblioteka))) == NULL) {
printf("Ошибка выделения памяти под pmfoot[%d}",i) ;
exit(2); }
skan(n, biblioteka[0]->avtor, biblioteka[0]->nazvanie,  biblioteka[0]->izdatelstvo, biblioteka[0]->janr, biblioteka[0]-> stranici);
 
for(i=0;i<n;i++)
    printf("\n%s %s %s %s %d",biblioteka[i]->avtor, biblioteka[i]->nazvanie, biblioteka[i]->izdatelstvo, biblioteka[i]->janr, biblioteka[i]->stranici);
 
for(i=0; i < n; i++) free(biblioteka[i]);
fclose(fp);
getch();
return 0;
}
 
void skan(int n, char *avtor, char *nazvanie, char *izdatelstvo, char *janr, int *stranici){
int i;
FILE *fp;
_biblioteka biblioteka;
fseek(fp, 0L, SEEK_SET);
i=0;
while (!feof(fp))
        {
        fscanf(fp,"%s %s %s %s %d",&biblioteka[i]->avtor, &biblioteka[i]->nazvanie, &biblioteka[i]->izdatelstvo, &biblioteka[i]->janr, &biblioteka[i]->stranici);
        i++;
        }
}

11

Re: Переробити із С++ на С

І що вам на це пише компілятор? Чи воно все ж компілюється і потім вилітає?

12

Re: Переробити із С++ на С

error: subscripted value is neither array nor pointer nor vector
це на рядку, де фсканф, 5 однакових помилок

13

Re: Переробити із С++ на С

tsarick.vlad написав:

error: subscripted value is neither array nor pointer nor vector
це на рядку, де фсканф, 5 однакових помилок

І це логічно: згідно з пріорітетом операторів, вираз &biblioteka[ i]->avtor розглядається як &((biblioteka[ i])->avtor). А змінна biblioteka, як і каже вам компілятор - не вказівник і не масив, і тому до неї не можна додавати індекс.
Я б вам іще щось порадив, але я взагалі не розумію, що за задумкою має робити функція skan...

14

Re: Переробити із С++ на С

Ця функція повинна відкрити файл, зчитати інформацію і занести її до структури. потім будуть інші функції, які будуть працювати із цією структурою. Тобто функція повинна повертати структуру

15

Re: Переробити із С++ на С

tsarick.vlad написав:

функція повинна повертати структуру

tsarick.vlad написав:
void skan(int n...

facepalm.jpg

16

Re: Переробити із С++ на С

koala написав:
tsarick.vlad написав:

функція повинна повертати структуру

tsarick.vlad написав:
void skan(int n...

facepalm.jpg

Прихований текст

Все - тлін. І всяка структура колись перетвориться на void, а на її кістках збудують піраміди масивів...