Помощь - Поиск - Пользователи - Календарь
Полная версия: Работа с файлами
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ада и другие языки
Rocket
Помогите пожалуйста в написании функций синхронизации массива с файлом. Функция чтения должна
считывать из файла указанные символы массива. Предполагается, что файл содержит массив целиком и при чтении необходимо считывать соответствующие элементы массива:
Считываются с 3 по 5 элементы из файла в массив:
Файл: 1 4 6 2 3 5 6 7 8 9

Массив: _ _ _ 2 3 5 _ _ _ _
Остальные элементы массив должны остаться без изменений.
При записи из массива в файл действия аналогичны.

Rocket
Ну вот, что у меня получилось:

#include<stdio.h>
#include<conio.h>

void mastofile(FILE *pF, int *mas, int a, int b )
{
int i;
pF=fopen("E:\C\fileN1","w+");
for (i=a;i<=b;i++)
{
fseek(pF, i*sizeof(int), SEEK_SET );
fwrite(&mas[i], sizeof(int), 1,pF);
}
fclose(pF);
}


void filetomas(FILE *pF, int *mas, int a, int b )
{
int i;
pF=fopen("E:\C\fileN1.dat","r");
for (i=a;i<=b;i++)
{
fseek(pF, i*sizeof(int), SEEK_SET );
fread(&mas[i], sizeof(int), 1,pF);
}
fclose(pF);
}

void ToShow(int mas[10])
{
int i;
for(i=0; i<=10; i++)
printf("\n3%d\n",mas[i]);

}

void main()
{
FILE *pF;
int masN1[5]={2,4,6,8,10},
masN2[5]={1,3,5,7,9};
clrscr();
filetomas(pF, masN1, 2, 4);
mastofile(pF, masN2, 2, 4);
ToShow(masN2);

}

Только она работает явно некорректно, в чём ошибка?
volvo
Файл как создавал? Или ты думаешь, что текстовый файл отработает с fread()?
Rocket
Цитата(volvo @ 16.12.2007 19:36) *

Файл как создавал? Или ты думаешь, что текстовый файл отработает с fread()?

А вот я использую "w+", это я разве не создаю, если его нет?
volvo
Сорри, ты сначала вызываешь filetomas, а там ты открываешь файл для "r", и если файла изначально нет - то будет ошибка... До создания файла дело не дойдет...

P.S. Пути нормально пропиши, кстати - бэкслеш должен быть двойным...
Rocket
Цитата(volvo @ 16.12.2007 20:01) *

Сорри, ты сначала вызываешь filetomas, а там ты открываешь файл для "r", и если файла изначально нет - то будет ошибка... До создания файла дело не дойдет...

P.S. Пути нормально пропиши, кстати - бэкслеш должен быть двойным...

Исправил, сейчас вроде работает стабильно, но по-прежнему выводятся значения как-то по-левому. Как эт испарвить-то?
volvo
Ну, так ты покажи, КАК исправил...
Rocket
Цитата(volvo @ 16.12.2007 20:22) *

Ну, так ты покажи, КАК исправил...

ну как-то так:

 
#include<stdio.h>
#include<conio.h>

void mastofile(FILE *pF, int *mas, int a, int b )
{
int i;
pF=fopen("E:\\C\\fileN1.dat","w+");
for (i=a;i<=b;i++)
{
fseek(pF, i*sizeof(int), SEEK_SET );
fwrite(&mas[i], sizeof(int), 1,pF);
}
fclose(pF);
}


void filetomas(FILE *pF, int *mas, int a, int b )
{
int i;
pF=fopen("E:\\C\\fileN1.dat","r");
for (i=a;i<=b;i++)
{
fseek(pF, i*sizeof(int), SEEK_SET );
fread(&mas[i], sizeof(int), 1,pF);
}
fclose(pF);
}

void ToShow(int *mas)
{
int i;
for(i=0; i<=10; i++)
printf("\n3%d\n",mas[i]);

}

void main()
{
FILE *pF;
int masN1[5]={2,4,6,8,10},
masN2[5]={1,3,5,7,9};
clrscr();
mastofile(pF, masN1, 2, 4);
filetomas(pF, masN2, 2, 4);
ToShow(masN2);

}

volvo
У тебя печать неправильно сделана... В массиве masN2 нет 11 элементов, есть только 5... Ну, и сама форматная строка не так задается...

void ToShow(int *mas)
{
int i;
for(i=0; i < 5; i++)
printf("\n%3d\n",mas[i]); // У тебя было "3%d" - это дает совсем другой эффект
}

Rocket
Цитата(volvo @ 16.12.2007 20:54) *

У тебя печать неправильно сделана... В массиве masN2 нет 11 элементов, есть только 5... Ну, и сама форматная строка не так задается...

void ToShow(int *mas)
{
int i;
for(i=0; i < 5; i++)
printf("\n%3d\n",mas[i]); // У тебя было "3%d" - это дает совсем другой эффект
}



Во, всё отлично работает! Большое спасибо!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.