Тема: Файли у мові С

Онлайн компілятор постійно видає незрозумілі помилки , що потрібно виправити в коді ?

#include<stdio.h>
#include<locale.h>
#include<ctype.h>
#pragma warning(disable : 4996) 
int main() 
{
    setlocale(lC_ALL,"ukr");
    FILE*ff;
    struct vidomist
    {
        char PIB[20];
        int den,mis,rik;
        char dim,stat;
    }
    vid[5]={"Саган В.М.",1,2,2001,І-Ф,Ч,
            "Туз В.В.",3,4,2000,І-Ф,Ч,
            "Розганюк Л.Л.",5,12,2001,Л,Ч,
            "Хомин Ю.В.",3,6,2000,Ч,Ж,
            "Халус Н.Т.",6,11,2001,І-Ф,Ч};
    ff=fopen("vidomist","w");
    for (int i=0;i<5;i++)
    {
        fprintf(ff,"%s\t\t%i\t%i\t%i\t%s\t%s\t",vid[i].PIB,vid[i].den,vid[i].mis,vid[i].rik,vid[i].dim,vid[i].stat);
    }
    fclose(ff);
    ff=fopen("result","r");
    fscanf(ff,"%s %i %i %i %s %s",name,den,mis,rik,dim,stat);
    if(mis<2000 && mis<=12 && den<7 && dim="І-Ф" && stat='Ч')
    {
        printf("%s",name);
        
    }
    fclose(ff);
    return 0;
}

2

Re: Файли у мові С

Давайте сюди текст незрозумілих помилок — спробуємо зрозуміти.

Подякували: koala, leofun012

3

Re: Файли у мові С

От код з виправленими деякими помилками

#include<stdio.h>
#include<stdlib.h>
#include<locale.h> 
#include<ctype.h>
#pragma warning(disable : 4996) 
int main() { 
 setlocale(LC_ALL,"ukr"); 
 FILE *ff; 
 struct vidomist { char PIB[30]; 
 int den,mis,rik;
 char dim,stat; 
 }vid[5] = {"Саган В.М.",1,2,2001,"І-Ф","Ч", 
  "Туз В.В.",3,4,2000,"І-Ф","Ч", 
  "Розганюк Л.Л.",5,12,2001,"Л","Ч", 
  "Хомин Ю.В.",3,6,2000,"Ч","Ж", 
  "Халус Н.Т.",6,11,2001,"І-Ф","Ч"}; 
 ff=fopen("vidomist","w"); 
 for (int i=0;i<5;i++) 
 { 
  fprintf(ff, "%s %i %i %i %s %s\n", vid[i].PIB, vid[i].den, vid[i].mis, vid[i].rik, vid[i].dim, vid[i].stat);
 } 
 fclose(ff); 
 ff=fopen("result","r"); 
 char name1, dim1, stat1;
 int den1, mis1, rik1;
 for (int i = 0; i < 5; i++)
 {
  fscanf(ff, "%s %i %i %i %s %s", &name1, &den1, &mis1, &rik1, &dim1, &stat1);
  if(rik1<2000 && mis1<=12 && den1<7 && dim1=='І-Ф' && stat1=='Ч') 
   { 
    printf("%s",name1); 
   }
 }
 fclose(ff); 
 return 0;
} 

4

Re: Файли у мові С

jdoodle.c: In function 'main':
jdoodle.c:12:42: warning: initialization makes integer from pointer without a cast [-Wint-conversion]
  }vid[5] = {"Саган В.М.",1,2,2001,"І-Ф","Ч", 
                                          ^
jdoodle.c:12:42: note: (near initialization for 'vid[0].dim')
jdoodle.c:12:50: warning: initialization makes integer from pointer without a cast [-Wint-conversion]
  }vid[5] = {"Саган В.М.",1,2,2001,"І-Ф","Ч", 
                                                  ^
jdoodle.c:12:50: note: (near initialization for 'vid[0].stat')
jdoodle.c:13:28: warning: initialization makes integer from pointer without a cast [-Wint-conversion]
   "Туз В.В.",3,4,2000,"І-Ф","Ч", 
                            ^
jdoodle.c:13:28: note: (near initialization for 'vid[1].dim')
jdoodle.c:13:36: warning: initialization makes integer from pointer without a cast [-Wint-conversion]
   "Туз В.В.",3,4,2000,"І-Ф","Ч", 
                                    ^
jdoodle.c:13:36: note: (near initialization for 'vid[1].stat')
jdoodle.c:14:39: warning: initialization makes integer from pointer without a cast [-Wint-conversion]
   "Розганюк Л.Л.",5,12,2001,"Л","Ч", 
                                       ^
jdoodle.c:14:39: note: (near initialization for 'vid[2].dim')
jdoodle.c:14:44: warning: initialization makes integer from pointer without a cast [-Wint-conversion]
   "Розганюк Л.Л.",5,12,2001,"Л","Ч", 
                                            ^
jdoodle.c:14:44: note: (near initialization for 'vid[2].stat')
jdoodle.c:15:32: warning: initialization makes integer from pointer without a cast [-Wint-conversion]
   "Хомин Ю.В.",3,6,2000,"Ч","Ж", 
                                ^
jdoodle.c:15:32: note: (near initialization for 'vid[3].dim')
jdoodle.c:15:37: warning: initialization makes integer from pointer without a cast [-Wint-conversion]
   "Хомин Ю.В.",3,6,2000,"Ч","Ж", 
                                     ^
jdoodle.c:15:37: note: (near initialization for 'vid[3].stat')
jdoodle.c:16:33: warning: initialization makes integer from pointer without a cast [-Wint-conversion]
   "Халус Н.Т.",6,11,2001,"І-Ф","Ч"}; 
                                 ^
jdoodle.c:16:33: note: (near initialization for 'vid[4].dim')
jdoodle.c:16:41: warning: initialization makes integer from pointer without a cast [-Wint-conversion]
   "Халус Н.Т.",6,11,2001,"І-Ф","Ч"}; 
                                         ^
jdoodle.c:16:41: note: (near initialization for 'vid[4].stat')
jdoodle.c:20:15: warning: format '%s' expects argument of type 'char *', but argument 7 has type 'int' [-Wformat=]
   fprintf(ff, "%s %i %i %i %s %s\n", vid[i].PIB, vid[i].den, vid[i].mis, vid[i].rik, vid[i].dim, vid[i].stat);
               ^
jdoodle.c:20:15: warning: format '%s' expects argument of type 'char *', but argument 8 has type 'int' [-Wformat=]
jdoodle.c:29:47: warning: character constant too long for its type
   if(rik1<2000 && mis1<=12 && den1<7 && dim1=='І-Ф' && stat1=='Ч') 
                                               ^
jdoodle.c:29:65: warning: multi-character character constant [-Wmultichar]
   if(rik1<2000 && mis1<=12 && den1<7 && dim1=='І-Ф' && stat1=='Ч') 
                                                                 ^
jdoodle.c:31:12: warning: format '%s' expects argument of type 'char *', but argument 2 has type 'int' [-Wformat=]
     printf("%s",name1); 
            ^
Command terminated by signal 11

5

Re: Файли у мові С

jdoodle.c:12:42: warning: initialization makes integer from pointer without a cast [-Wint-conversion]
  }vid[5] = {"Саган В.М.",1,2,2001,"І-Ф","Ч", 

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

Як це виправити: треба використовувати не константу-рядок "Ч", а константу-символ 'Ч' — зверніть увану на лапки та апострофи. Завжди звертайте увагу на тип даних — якщо це char (а не char* чи char[]), то йому можна присвоювати лише символи, а не рядки (навіть якщо рядок складається з одного символа, це все одно рядок, а не символ).

jdoodle.c:16:41: note: (near initialization for 'vid[4].stat')
jdoodle.c:20:15: warning: format '%s' expects argument of type 'char *', but argument 7 has type 'int' [-Wformat=]
   fprintf(ff, "%s %i %i %i %s %s\n", vid[i].PIB, vid[i].den, vid[i].mis, vid[i].rik, vid[i].dim, vid[i].stat);

Тут аналогічна проблема, але при виводі. Якщо виводите char, то в рядку формату слід для нього використовувати не %s, а %c.

Подякували: leofun01, sahanvalentun2

6

Re: Файли у мові С

Дуже дякую за інформацію , буду виправляти помилки

7

Re: Файли у мові С

P.S. Поле dim краще зробити не символом, а масивом з символів достатньої довжини, щоб туди помістилось І-Ф. Або замінити "І-Ф" односимвольним позначенням і взяти в апострофи замість лапок, щоб це був символ.

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

8

Re: Файли у мові С

Ще розрізняйте помилки (error) і попередження (warning). Програма з попередженнями, в принципі, може працювати; але попередження означає, що ви робите щось дуже дивне, тому попереджень теж краще позбуватися.

Подякували: P.Y., sahanvalentun, leofun013

9

Re: Файли у мові С

Дякую за допомогу

10

Re: Файли у мові С

Я ніби все виправив , але помилки все ще є

jdoodle.c: In function 'main':
jdoodle.c:12:42: warning: multi-character character constant [-Wmultichar]
  }vid[5] = {"Саган В.М.",1,2,2001,'І','Ч', 
                                          ^
jdoodle.c:12:42: warning: overflow in implicit constant conversion [-Woverflow]
jdoodle.c:12:47: warning: multi-character character constant [-Wmultichar]
  }vid[5] = {"Саган В.М.",1,2,2001,'І','Ч', 
                                               ^
jdoodle.c:12:47: warning: overflow in implicit constant conversion [-Woverflow]
jdoodle.c:13:28: warning: multi-character character constant [-Wmultichar]
   "Туз В.В.",3,4,2000,'І','Ч',
                            ^
jdoodle.c:13:28: warning: overflow in implicit constant conversion [-Woverflow]
jdoodle.c:13:33: warning: multi-character character constant [-Wmultichar]
   "Туз В.В.",3,4,2000,'І','Ч',
                                 ^
jdoodle.c:13:33: warning: overflow in implicit constant conversion [-Woverflow]
jdoodle.c:14:39: warning: multi-character character constant [-Wmultichar]
   "Розганюк Л.Л.",5,12,2001,'Л','Ч',
                                       ^
jdoodle.c:14:39: warning: overflow in implicit constant conversion [-Woverflow]
jdoodle.c:14:44: warning: multi-character character constant [-Wmultichar]
   "Розганюк Л.Л.",5,12,2001,'Л','Ч',
                                            ^
jdoodle.c:14:44: warning: overflow in implicit constant conversion [-Woverflow]
jdoodle.c:15:32: warning: multi-character character constant [-Wmultichar]
   "Хомин Ю.В.",3,6,2000,'Ч','Ж', 
                                ^
jdoodle.c:15:32: warning: overflow in implicit constant conversion [-Woverflow]
jdoodle.c:15:37: warning: multi-character character constant [-Wmultichar]
   "Хомин Ю.В.",3,6,2000,'Ч','Ж', 
                                     ^
jdoodle.c:15:37: warning: overflow in implicit constant conversion [-Woverflow]
jdoodle.c:16:33: warning: multi-character character constant [-Wmultichar]
   "Халус Н.Т.",6,11,2001,'І','Ч'}; 
                                 ^
jdoodle.c:16:33: warning: overflow in implicit constant conversion [-Woverflow]
jdoodle.c:16:38: warning: multi-character character constant [-Wmultichar]
   "Халус Н.Т.",6,11,2001,'І','Ч'}; 
                                      ^
jdoodle.c:16:38: warning: overflow in implicit constant conversion [-Woverflow]
jdoodle.c:20:15: warning: format '%c' expects argument of type 'int', but argument 3 has type 'char *' [-Wformat=]
   fprintf(ff, "%c %i %i %i %c %c\n", vid[i].PIB, vid[i].den, vid[i].mis, vid[i].rik, vid[i].dim, vid[i].stat);
               ^
jdoodle.c:29:47: warning: multi-character character constant [-Wmultichar]
   if(rik1<2000 && mis1<=12 && den1<7 && dim1=='І' && stat1=='Ч') 
                                               ^
jdoodle.c:29:62: warning: multi-character character constant [-Wmultichar]
   if(rik1<2000 && mis1<=12 && den1<7 && dim1=='І' && stat1=='Ч') 
                                                              ^
Command terminated by signal 11

11

Re: Файли у мові С

В printf (і його різновидах) %c - це _один_ символ (char, в одинарних лапках, на кшталт 'a'), %s - стрічка, що завершується нулем (char [], у подвійних лапках, "abc"), %i - ціле число (int, 123). Будь ласка, наведіть лад зі специфікаторами.
Крім того, схоже, що у вас сам файл .cpp в UTF, тобто кириличні символи насправді займають по кілька байтів (фактично wchar_t).
Якщо не маєте бажання мати пару ночей жорсткого BDSM заради простої лаби - використовуйте, де можливо, латинку.

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

12

Re: Файли у мові С

Добре , я все зрозумів і зробив порядок зі специфікаторами , але тепер виникла така проблема

Command terminated by signal 11

13

Re: Файли у мові С

А це (signal 11 - segmentation fault) означає, що ви десь лізете в чужу пам'ять. Наприклад, намагаєтеся виводити int як %s, причому int перетворюється на вказівник на випадково чужу пам'ять.

14

Re: Файли у мові С

Зрозуміло , але помилку такого типу я знайти не можу

15

Re: Файли у мові С

Ми теж.
Принаймні без коду.

16

Re: Файли у мові С

#include<stdio.h>
#include<stdlib.h>
#include<locale.h> 
#include<ctype.h>
int main() 
{ 
 FILE *ff; 
 struct vidomist 
 {
     char PIB[30]; 
     int den,mis,rik;
     char dim,stat; 
 }
 vid[5] = {"Саган В.М.",1,2,2001,'I','M', 
  "Туз В.В.",3,4,2000,'I','M',
  "Розганюк Л.Л.",5,12,2001,'L','M',
  "Хомин Ю.В.",3,6,2000,'I','W', 
  "Халус Н.Т.",6,11,2001,'I','M'}; 
 ff=fopen("vidomist","w"); 
 for (int i=0;i<5;i++) 
 { 
  fprintf(ff, "%s %i %i %i %c %c \n", vid[i].PIB, vid[i].den, vid[i].mis, vid[i].rik, vid[i].dim, vid[i].stat);
 } 
 fclose(ff); 
 ff=fopen("result","r"); 
 char name1, dim1, stat1;
 int den1, mis1, rik1;
 for (int i = 0; i < 5; i++)
 {
  fscanf(ff, "%s %i %i %i %c %c", &name1, &den1, &mis1, &rik1, &dim1, &stat1);
  if(rik1<2000 && mis1<=12 && den1<7 && dim1=='I' && stat1=='M') 
   { 
    printf("%c  ",name1); 
   }
 }
 fclose(ff); 
 return 0;
}

17

Re: Файли у мові С

І в останній умові повинно бути <=2000

18 Востаннє редагувалося koala (09.12.2019 17:53:31)

Re: Файли у мові С

"%s %i %i %i %c %c", &name1,

name1 - char, а не char []. Один символ. Ви туди читаєте %s, тобто багато символів.
Додаткова проблема: %s читає до пробіла. Цю проблему обговорювали тут.