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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.01.2008, 02:39   #1
Raptor
Пользователь
 
Регистрация: 24.11.2007
Сообщений: 50
По умолчанию Текстовые файлы на С

Написал две функции. Первая записывает в файл, вторая считывает и выводит на экран.

Но почемуто когда открываешь файл, независимо от того - в ручную или через прогу - вместо информациия всякаячушь типа
"  "@јT &@ "
или 0;

Мож кто-нибудь знает в чем дело.
Заранее спасибо!

Код:
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>

struct rec
{
  char name;
  int tries;
double ti;
  int punkti;
	 };
void zapis_v_fail(char Name, int tries, double ti, int punkti)
{
struct rec Info;
FILE *f;
f=fopen("rez.dat","a");
Info.name=Name;
Info.tries=tries;
Info.punkti=punkti;
Info.ti=ti;
fwrite(&Info,sizeof(struct rec),1,f);
fclose(f);
}

fileopen()
{
int izmers,i;
char neim;
FILE *f;
	 struct rec Info;
 f=fopen("rez.dat","r");
	 if (!f)
{
	gotoxy(20,17);
	textcolor(RED);
	cprintf("FAILU NEVAR NOLASIT");
	textcolor(WHITE);
	getch();
	goto END;
	}
izmers=sizeof(struct rec);
fseek(f,0,SEEK_SET);
i=0;
gotoxy(5,10);  // KUR VAJAG IZVADIT TABULAS VIRSRAXTUS
printf("Vaards        Meg skaits       Laiks      Punkti");
while ( fread(&Info,izmers,1,f) == 1 ) {
gotoxy(5,11+i);
printf("%s    %d     %d    %i", Info.name, Info.tries, Info.ti, Info.punkti);
i++;
}
fclose(f);
getch();
END:

}
Здесь double ti - переменная несущая значение difftime(second,first);
Raptor вне форума Ответить с цитированием
Старый 24.01.2008, 04:23   #2
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Потому, что размер поля "name" в структуре - 1 байт (и в определении zapis_v_fail - тоже). Насколько я понимаю, там должна быть строка(судя по "printf("%s.......", тогда нужно хотя бы объявлять массив.
B_N вне форума Ответить с цитированием
Старый 24.01.2008, 08:01   #3
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Чтобы файл можно было читать "глазами", он должен быть текстовым, т. е. с расширением *txt. Все прочие файлы читаются только программой.
puporev вне форума Ответить с цитированием
Старый 24.01.2008, 09:48   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
он должен быть текстовым, т. е. с расширением *txt.
Я наверное немного поправлю: не просто с расширением, а еще скорее всего числовые переменные записываются как набор байт т.е. не особо читаемый формат.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.01.2008, 19:19   #5
Raptor
Пользователь
 
Регистрация: 24.11.2007
Сообщений: 50
По умолчанию

Спасибо всем за помощь, попробую исправить.
Raptor вне форума Ответить с цитированием
Старый 24.01.2008, 20:05   #6
Raptor
Пользователь
 
Регистрация: 24.11.2007
Сообщений: 50
По умолчанию

С первой разобрался.
Вот,если кого интересует, исправленный вар. 1 функции.

Код:
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
struct rec
{
  char name[32];
  int tries;
	double ti;
  int punkti;
	 }Info;


void zapis_v_fail(char Name[32], int *tries, double ti, int punkti)
{getch();
FILE *f;
f=fopen("2.txt","a");
//Name="Padla";
Info.tries=*tries;
Info.punkti=punkti;
Info.ti=ti;
printf("\n");
gotoxy(5,10);

fprintf(f, "%10s      %5i      %5.0f      %5d\n", Name, Info.tries, Info.ti, Info.punkti);
fclose(f);
}

Последний раз редактировалось Raptor; 25.01.2008 в 00:05.
Raptor вне форума Ответить с цитированием
Старый 25.01.2008, 01:02   #7
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Raptor, учтите только, что так делать - очень плохой тон и потенциальная опасность стековых эксплойтов. Лучше всё-таки через указатели делать, через старый добрый LPSTR (ну или PCHAR, unsigned char*, как больше нравится)
B_N вне форума Ответить с цитированием
Старый 26.01.2008, 17:17   #8
Raptor
Пользователь
 
Регистрация: 24.11.2007
Сообщений: 50
По умолчанию

А можно чуть-чуть подробнне? Спасибо.
Окончательный вариант:

Код:
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
struct rec
{
  char name[32];
  int tries;
	double ti;
  int punkti;
	 }Info;

void zapis_v_fail(int *tries, double ti, int punkti)
{gotoxy(25,21);
printf("Vase imja: ");
gotoxy(39,21);
scanf("%s", Info.name);
FILE *f;
f=fopen("2.txt","a");
Info.tries=*tries;
Info.punkti=punkti;
Info.ti=ti;
printf("\n");
gotoxy(5,10);

fprintf(f, "%10s      %5i      %5.0f      %5d\n", Info.name, Info.tries, Info.ti, Info.punkti);
gotoxy(1,25);
textbackground(GREEN);
cprintf("     Information saved     ");
fclose(f);
}
Raptor вне форума Ответить с цитированием
Старый 26.01.2008, 19:27   #9
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Постараюсь поподробнее. Дело в том, что когда Вы определяете вектора фиксированной длины прямо в стуктуре, есть опасность забыть 1) и поместить такую структуру в стеке в качестве локальной переменной, 2) забыть перед копированием в такую "строку" сравнить размеры источника и приемника. Отсюда вытекает опасность, что Вам в функцию передадут строку длиннее ожидаемой и смогут "перебить" адрес возврата из функции. Это и есть классический стековый эксплойт - страшно опасная вещь, если не принимать меры по предотвращению. И самые эффективные меры, это прежде всего проверять размер параметра. В крайнем варианте я не видел у Вас кода, заполняющего структуру снружи функции, но конструкция "scanf("%s", Info.name);" выгядит очень своеобразно , уж извиняйте, все таки быстродействие тоже немаловажный фактор, и кроме того это опасно: scanf не знает размера буфера и будет забивать его пока \0 не попадется.
B_N вне форума Ответить с цитированием
Старый 26.01.2008, 19:37   #10
Raptor
Пользователь
 
Регистрация: 24.11.2007
Сообщений: 50
По умолчанию

Тоесть, Вы советуете использовать здесь вместо scanf другую функцию типа gets?
Raptor вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа, анализирующая текстовые файлы и строящая графики Karabister Фриланс 15 08.06.2008 15:30
Задача на текстовые файлы Paul11j Помощь студентам 20 17.03.2008 13:20
текстовые файлы ОЧЕНЬ НУЖНА ПОМОЩЬ leest Помощь студентам 6 30.01.2008 10:05
Текстовые файлы(задачка). Vadim2008 Общие вопросы C/C++ 1 11.01.2008 16:45