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

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.12.2014, 19:37   #11
assapeo
Пользователь
 
Регистрация: 12.12.2014
Сообщений: 12
По умолчанию

Если всё понятно, то могли бы как-нибудь помочь, мне далеко не всё понятно. У меня задание такое, что нужно использовать бинарный режим, поэтому текстовый и не годится.
Я думал, что текстовый файл выглядит так:



А бинарный так:



Подскажите, как сделать так, чтобы в файл информация о новом футболисте записывалась с новой строки? Вот код:
Код:
#include <stdio.h>
#include <stdlib.h>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char *argv[]) {
	const char fname[50]="abc.dat";
	int x, y;
	typedef struct {
		char player[20];
		char goals[20]; 
		char assists[20]; 
		char cards[20]; 
	}
	football;
	football A[100];
	printf("Number of players: ");
	scanf("%d",&y);
    FILE *fp;
	fp=fopen(fname,"wb");
	if (fp != NULL) {
	for (x=0; x<y;x++) {
        printf("\nPlayers surname: ");
		scanf("%s", &A[x].player);
		printf("Number of goals: ");
		scanf("%s", &A[x].goals);
		printf("Number of assists: ");
		scanf("%s", &A[x].assists);
		printf("Number of cards:");
		scanf("%s", &A[x].cards);
	}
		fwrite(&A,sizeof(football),y,fp);
			fclose(fp);
		}
		return 0;
}
И спрашиваю я том, написан ли этот код в бинарном режиме, потому, что получается файл, как на первой картинке.

Последний раз редактировалось assapeo; 12.12.2014 в 19:41.
assapeo вне форума Ответить с цитированием
Старый 12.12.2014, 19:59   #12
assapeo
Пользователь
 
Регистрация: 12.12.2014
Сообщений: 12
По умолчанию

Вообще задание такое:
сделать две программы, одна из которых предназначена для ввода данных и их вставки в файл, а вторая программа выводит определённые данные в виде таблицы.
Как и говорил, с текстовым режимом проблем не было, всё работало:
Код:
#include <stdio.h>
#include <stdlib.h>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char *argv[]) {
	const char fname[50]="abc.dat";
	int x, y;
	typedef struct {
		char player[20];
		char goals[20]; 
		char assists[20]; 
		char cards[20]; 
	}
	football;
	football A[100];
	printf("Number of players: ");
	scanf("%d",&y);
    FILE *fp;
	fp=fopen(fname,"w");
	//if (fp != NULL) {
	for (x=0; x<y;x++) {
        printf("\nPlayers surname: ");
		scanf("%s", &A[x].player);
		printf("Number of goals: ");
		scanf("%s", &A[x].goals);
		printf("Number of assists: ");
		scanf("%s", &A[x].assists);
		printf("Number of cards:");
		scanf("%s", &A[x].cards);
	
	fprintf(fp,"%s %s %s %s\n", A[x].player, A[x].goals, A[x].assists, A[x].cards);
	//	fwrite(&A,sizeof(football),y,fp);
			fclose(fp);
		}
		return 0;
}
Но в бинарный режим не получается переписать.
assapeo вне форума Ответить с цитированием
Старый 12.12.2014, 20:52   #13
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,152
По умолчанию

почитай про ASCII. И прочие кодировки.
И тогда поймешь, что текстовый режим от бинарного отличается разве что обработкой символа перевода строки и еще что нулевой байт в тексте строго не рекомендуется использовать) По крайней мере, такое понимание различия в С++ меня полностью устраивает на практике.
Smogg вне форума Ответить с цитированием
Старый 12.12.2014, 20:58   #14
assapeo
Пользователь
 
Регистрация: 12.12.2014
Сообщений: 12
По умолчанию

У кого-то задание связано с текстовым режимом, у кого-то, как у меня, с бинарным режимом. Я смог сделать в текстовом, но не знаю, что переделать, чтобы в бинарном работало. Простая замена "w" на "wb" и добавление fwrite(mas, sizeof(Point), count, fp); не помогли. То, что ответили Вы, не ответ на мой вопрос.
assapeo вне форума Ответить с цитированием
Старый 12.12.2014, 21:17   #15
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,152
По умолчанию

блин... char в текстовом и бинарном - одна фигня.
Если так упирается, добавляй при записи к чару 141(78, 13, 42...), а при чтении - вычитай. Или применяй XOR. И получишь тогда свою желаемую крякoзябру.
Smogg вне форума Ответить с цитированием
Старый 12.12.2014, 23:02   #16
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
То, что ответили Вы, не ответ на мой вопрос.
А на него нельзя ответить правильно, если вопрошающий уверен в абсолютной неверности верного ответа и упирается рогом обо все доводы.
Твоя программа работает в бинарном режиме, это видно по коду.
Если ты не понимаешь что символ что в бинарном что в текстовом выглядит одинаково, то смысла что-то пояснять нет.
Вот тебе пример истинно бинарной записи\чтения: http://www.programmersforum.ru/showthread.php?t=105501
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.12.2014, 01:30   #17
assapeo
Пользователь
 
Регистрация: 12.12.2014
Сообщений: 12
По умолчанию

Спасибо за ответ! Не могли бы сказать, что надо изменить во второй программе, чтобы она работала? Она должна показывать все фамилии игроков, и после ввода одной из этих фамилий должны показываться данные, связанные с этой фамилией.
Код:
#include <stdio.h>
#include <stdlib.h>
 
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
 
int main(int argc, char *argv[]) {
    const char fname[32]="abc.dat";
    int i=0, z=0, m=0;
    typedef struct {
        char player[20];
        char goals[20];
        char assists[20];
        char cards[20];
    }
    football;
    football A[100];
    FILE *fp;
    fp=fopen(fname, "rb");
    if (fp==NULL) return 0;
    printf("All players");
    m=fread(A,sizeof(football),100,fp);
    return m;
    //while (!feof(fp)) {
    //  fscanf(fp, "%s %s %s %s\n", A[z].d , A[z].p , A[z].k , A[z].s); z++;}
        
        
        for (i=0; i<4; i++) {
            
        printf("\n %s", A[i].player) ;}
        char k2[50]="";
        printf("\n\nWrite players name to get information about him:");
        scanf ("%s",&k2);
            for (i=0; i<z; i++) {
                if (strcmp(A[i].player, k2) == 0){
                    printf("\nPlayers surname: %s\n Number of goals: %s\n Number of assists: %s\n Number of cards: %s\n", 
 A[i].player, A[i].goals, A[i].assists, A[i].cards);}
                }
                system("pause");
            return 0;
                }
assapeo вне форума Ответить с цитированием
Старый 13.12.2014, 01:38   #18
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Вам уже говорили - для начала убрать
Код:
 return m;
Потом, вы считаете записи в z, а цикл на фамилии явно забит на 4

Последний раз редактировалось p51x; 13.12.2014 в 01:40.
p51x вне форума Ответить с цитированием
Старый 13.12.2014, 01:48   #19
assapeo
Пользователь
 
Регистрация: 12.12.2014
Сообщений: 12
По умолчанию

Куда переставить return m? Передвинул его в конец, заменил "4" на "z", всё равно не работает.
Код:
#include <stdio.h>
#include <stdlib.h>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char *argv[]) {
	const char fname[32]="abc.dat";
	int i=0, z=0, m=0;
	typedef struct {
		char player[20];
		char goals[20];
		char assists[20];
		char cards[20];
	}
	football;
	football A[100];
	FILE *fp;
	fp=fopen(fname, "rb");
	if (fp==NULL) return 0;
	printf("All players");
	m=fread(A,sizeof(football),100,fp);
	//while (!feof(fp)) {
	//	fscanf(fp, "%s %s %s %s\n", A[z].d , A[z].p , A[z].k , A[z].s); z++;}
        
		
		for (i=0; i<z; i++) {
			
		printf("\n %s", A[i].player) ;}
		char k2[50]="";
		printf("\n\nWrite players name to get information about him:");
		scanf ("%s",&k2);
			for (i=0; i<z; i++) {
				if (strcmp(A[i].player, k2) == 0){
					printf("\nPlayers surname: %s\n Number of goals: %s\n Number of assists: %s\n Number of cards: %s\n", 
                                                        A[i].player, A[i].goals, A[i].assists, A[i].cards);}
				}
			return m;
			system("pause");
				}
Очевидно, что сейчас проблема в z, ведь он равняется 0. Как сделать этот z счётчиком, который посчитает сколько в файле abc записей про игроков?

Последний раз редактировалось Stilet; 13.12.2014 в 09:08.
assapeo вне форума Ответить с цитированием
Старый 13.12.2014, 02:21   #20
assapeo
Пользователь
 
Регистрация: 12.12.2014
Сообщений: 12
По умолчанию

Переставил system ("pause"); в другую строчку, теперь, если знать, сколько игроков в файле, то можно получить данные о них. Остаётся сделать счётчик для z.
Код:
#include <stdio.h>
#include <stdlib.h>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char *argv[]) {
	const char fname[32]="abc.dat";
	int i=0, z=4, m=0;
	typedef struct {
		char player[20];
		char goals[20];
		char assists[20];
		char cards[20];
	}
	football;
	football A[100];
	FILE *fp;
	fp=fopen(fname, "rb");
	if (fp==NULL) return 0;
	printf("All players");
	m=fread(A,sizeof(football),100,fp);
//	while (!feof(fp)) {
//		fscanf(fp, "%s %s %s %s\n", A[z].d , A[z].p , A[z].k , A[z].s); z++;}
        
		
		for (i=0; i<z; i++) {
			
		printf("\n %s", A[i].player) ;}
		char k2[50]="";
		printf("\n\nWrite players name to get information about him:");
		scanf ("%s",&k2);
			for (i=0; i<z; i++) {
				if (strcmp(A[i].player, k2) == 0){
					printf("\nPlayers surname: %s\n Number of goals: %s\n Number of assists: %s\n Number of cards: %s\n", 
                                                    A[i].player, A[i].goals, A[i].assists, A[i].cards);}
			system("pause");	}
			return m;
				}

Последний раз редактировалось Stilet; 13.12.2014 в 09:06.
assapeo вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C++, задача на бинарный файл (Бинарный файл состоит из записей по 5 бит) zaitsevmishka Помощь студентам 3 16.05.2014 21:39
бинарный поиск. алексей2011 Помощь студентам 0 01.07.2011 04:32
Бинарный файл Хитман Помощь студентам 1 27.03.2011 19:04
Бинарный поиск Виктория7777 Помощь студентам 6 13.01.2011 16:07
С++ бинарный оператор nadin777 Помощь студентам 1 27.01.2010 13:58