IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Работа с файлами, Язык C
сообщение
Сообщение #1


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


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

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

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


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

#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);

}

Только она работает явно некорректно, в чём ошибка?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






Файл как создавал? Или ты думаешь, что текстовый файл отработает с fread()?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Цитата(volvo @ 16.12.2007 19:36) *

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

А вот я использую "w+", это я разве не создаю, если его нет?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






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

P.S. Пути нормально пропиши, кстати - бэкслеш должен быть двойным...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


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

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

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

Исправил, сейчас вроде работает стабильно, но по-прежнему выводятся значения как-то по-левому. Как эт испарвить-то?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гость






Ну, так ты покажи, КАК исправил...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Цитата(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);

}

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






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

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

 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Цитата(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" - это дает совсем другой эффект
}



Во, всё отлично работает! Большое спасибо!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 24.12.2024 1:03
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name