Поменять записи местами

Ответить
lekha
Сообщения: 15
Зарегистрирован: 09 апр 2009, 08:04

Код: Выделить всё

#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 записи о спортсменах местами в файле. Файл новый создавать не надо, поэтому для обмена используется дополнительная структура. Программу я вроде б написал, только когда открываю файл выдается всякая бяка(
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

lekha писал(а):

Код: Выделить всё

 когда открываю файл выдается всякая бяка([/quote] 1) Каким образом (какой программой) открываете файл?
2) А ЧТО Вы там ожидли увидеть?
lekha
Сообщения: 15
Зарегистрирован: 09 апр 2009, 08:04

1) Открываю блокнотом :)
2) Первые 2 введенные записи должны отображаться в обратном порядке и символы, из которых состоят записи должны быть понятные)
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

lekha писал(а):1) Открываю блокнотом :)
Вы пишите бинарные данные (number, points) и каким образом Вы собираетесь увидеть их через блокнот?
В блокноте только символьный surname худо-бедно можно "разглядеть".
У Вас же не текстовый файл, чтобы его блокнотом смотреть.
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Как раз вся проблема в том, что исходные данные он берёт из текстового файла, преобразует строки в бинарные структуры, меняет эти структуры местами... А обратно в файл записывает эти же бинарные структуры, но без преобразования их в текстовые строки. Вот и получается, что на входе файл текстовый, а на выходе уже бинарный. Нужно добавить функцию sprintf, которая будет формировать текстовую строку из бинарной структуры перед записью в файл.
lekha
Сообщения: 15
Зарегистрирован: 09 апр 2009, 08:04

WinMain, т.е. мне эту функцию вместо fwrite использовать?
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Если вместо fwrite, то тогда нужно использовать fprintf.
Я в предыдущем сообщении допустил ошибку, сказав что данные берутся из текстового файла.
У тебя файл с расширением .txt, но данные там хранятся в бинарном виде, поэтому в Блокноте они не читаются. Если хочешь файл просматривать в Блокноте, то нужно и хранить там данные в виде текстовых строк.
Как ты в самом начале программы берёшь данные с консоли, так же и из файла ты их должен брать, сначала читаешь строку из файла, а потом её преобразуешь в структуру. А при записи в файл наоборот, структуру преобразуешь в строку и записываешь в файл.
lekha
Сообщения: 15
Зарегистрирован: 09 апр 2009, 08:04

Тогда как структуру преобразовать в строку?
Мне нужно копировать структурные переменные при этом их построчно складывая в выбранную мной произвольную строку, а потом уже записывать в текстовый файл?
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

В твоём случае это будет так:

Код: Выделить всё

// Запись в файл...
 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];
lekha
Сообщения: 15
Зарегистрирован: 09 апр 2009, 08:04

Понял, спасибо за помощь ;)
+++++++++++++++++++++++++++++++++++
Ответить