Страница 1 из 1
Поменять записи местами
Добавлено: 15 апр 2009, 06:44
lekha
Код: Выделить всё
#include <stdio.h>
#include <conio.h>
#include <string.h>
#define n putchar('\n');
main()
{
FILE *f;
struct sportsman
{
char surname[8];
int number;
int points;
} a,b[10];
puts("Enter info about sportsman");
n;
int i=0,k=0; char c,t[8];
f=fopen("sportsman.txt","w");
do
{
printf("Sportsman #%d: ",i+1);
scanf("%s %d %d",&a.surname,&a.number,&a.points);
fwrite(&a,sizeof(a),1,f);
k++; i++;
printf("End?[y]");
c=getch();
n;
}
while(c != 'y');
fclose(f);
i=0;
f=fopen("sportsman.txt","r");
fread(&a,sizeof(a),1,f);
while(!feof(f))
{
strcpy(b[i].surname,a.surname);
b[i].number=a.number;
b[i].points=a.points;
fread(&a,sizeof(a),1,f);
i++;
}
fclose(f);
strcpy(t,b[2].surname); strcpy(b[2].surname,b[1].surname); strcpy(b[1].surname,t);
f=fopen("sportsman.txt","w");
for(i=0; i < k; i++)
{
fwrite(&b[i],sizeof(b[i]),1,f);
}
fclose(f);
getch();
return 0;
}
Нужно поменять первые 2 записи о спортсменах местами в файле. Файл новый создавать не надо, поэтому для обмена используется дополнительная структура. Программу я вроде б написал, только когда открываю файл выдается всякая бяка(
Re: Поменять записи местами
Добавлено: 15 апр 2009, 09:29
BBB
lekha писал(а):Код: Выделить всё
когда открываю файл выдается всякая бяка([/quote] 1) Каким образом (какой программой) открываете файл?
2) А ЧТО Вы там ожидли увидеть?
Re: Поменять записи местами
Добавлено: 15 апр 2009, 12:39
lekha
1) Открываю блокнотом

2) Первые 2 введенные записи должны отображаться в обратном порядке и символы, из которых состоят записи должны быть понятные)
.
Добавлено: 15 апр 2009, 15:17
BBB
lekha писал(а):1) Открываю блокнотом
Вы пишите бинарные данные (number, points) и каким образом Вы собираетесь увидеть их через блокнот?
В блокноте только символьный surname худо-бедно можно "разглядеть".
У Вас же не текстовый файл, чтобы его блокнотом смотреть.
Re: Поменять записи местами
Добавлено: 15 апр 2009, 16:34
WinMain
Как раз вся проблема в том, что исходные данные он берёт из текстового файла, преобразует строки в бинарные структуры, меняет эти структуры местами... А обратно в файл записывает эти же бинарные структуры, но без преобразования их в текстовые строки. Вот и получается, что на входе файл текстовый, а на выходе уже бинарный. Нужно добавить функцию sprintf, которая будет формировать текстовую строку из бинарной структуры перед записью в файл.
Добавлено: 16 апр 2009, 18:31
lekha
WinMain, т.е. мне эту функцию вместо fwrite использовать?
Re: Поменять записи местами
Добавлено: 16 апр 2009, 19:28
WinMain
Если вместо fwrite, то тогда нужно использовать fprintf.
Я в предыдущем сообщении допустил ошибку, сказав что данные берутся из текстового файла.
У тебя файл с расширением .txt, но данные там хранятся в бинарном виде, поэтому в Блокноте они не читаются. Если хочешь файл просматривать в Блокноте, то нужно и хранить там данные в виде текстовых строк.
Как ты в самом начале программы берёшь данные с консоли, так же и из файла ты их должен брать, сначала читаешь строку из файла, а потом её преобразуешь в структуру. А при записи в файл наоборот, структуру преобразуешь в строку и записываешь в файл.
Re: Поменять записи местами
Добавлено: 16 апр 2009, 20:06
lekha
Тогда как структуру преобразовать в строку?
Мне нужно копировать структурные переменные при этом их построчно складывая в выбранную мной произвольную строку, а потом уже записывать в текстовый файл?
Re: Поменять записи местами
Добавлено: 16 апр 2009, 23:14
WinMain
В твоём случае это будет так:
Код: Выделить всё
// Запись в файл...
f=[color=#0000dd]fopen[/color][color=#000000]([/color][color=#666666]"sportsman.txt"[/color],[color=#666666]"wt"[/color][color=#000000])[/color];
[color=#0000ff]for[/color][color=#000000]([/color]i=[color=#0000dd]0[/color]; i < k; i++[color=#000000])[/color]
[color=#000000]{[/color]
[color=#0000dd]fprintf(f, [color=#666666]"%s %d %d"[/color],b[i].[color=#00eeff]surname[/color],b[i].[color=#00eeff]number[/color],b[i].[color=#00eeff]points[/color][color=#000000])[/color];[/color]
[color=#000000]}[/color]
[color=#0000dd]fclose[/color][color=#000000]([/color]f[color=#000000])[/color];
// Чтение из файла...
int i = 0;
char str[80];
f=[color=#0000dd]fopen[/color][color=#000000]([/color][color=#666666]"sportsman.txt"[/color],[color=#666666]"rt"[/color][color=#000000])[/color];
[color=#0000ff]while[/color][color=#000000]([/color]![color=#0000dd]feof[/color][color=#000000]([/color]f[color=#000000])[/color][color=#000000])[/color]
[color=#000000]{[/color]
[color=#000000] fgets(str, sizeof(str), f);[/color]
if (strlen(str) > 0)
[color=#000000][color=#0000dd] sscanf[/color][color=#000000](str, [/color][color=#666666]"%s %d %d"[/color], b[i].[color=#00eeff]surname[/color], &b[i].[color=#00eeff]number[/color], &b[i].[color=#00eeff]points[/color][color=#000000])[/color];[/color]
i++;
[color=#000000]}[/color]
[color=#0000dd]fclose[/color][color=#000000]([/color]f[color=#000000])[/color];
Re: Поменять записи местами
Добавлено: 19 апр 2009, 14:25
lekha
Понял, спасибо за помощь

+++++++++++++++++++++++++++++++++++