Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / C89: Произвольный доступ к файлу посредством fgetpos\fsetpos / 2 сообщений из 2, страница 1 из 1
17.12.2013, 23:13
    #38504370
Compositum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C89: Произвольный доступ к файлу посредством fgetpos\fsetpos
Доброго времени суток.

Произвольный доступ к файлу можно осуществлять либо посредством fseek, либо через fgetpos\fsetpos.

С использованием fseek вроде проблем никаких не возникает:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
// В данном примере для произвольного доступа
// к файлу я использую fseek 
#include<stdio.h>
int main(int argc, char* argv[]){	
	char* fn="./test.txt";
	FILE* f=fopen(fn,"w+");
		
	fprintf(f,"%s","Vasya, Kolya, Petya.");
	fflush(f); // прежде чем запомнить позицию 
	// последнего символа, освобождаю буфер
	
	// Меняю 'Vasya' на 'Vanya'
	fseek(f,2,SEEK_SET);
	fputc('n',f);
	fflush(f); // прежде чем запомнить позицию 
	// последнего символа, освобождаю буфер
	
	// Меняю 'Petya.' на 'Dasha & Masha.'
	fseek(f,14,SEEK_SET);
	fprintf(f,"%s","Dasha & Masha.");
	fflush(f); // прежде чем запомнить позицию 
	// последнего символа, освобождаю буфер
	
	fclose(f);
}



test.txtVanya, Kolya, Dasha & Masha.


Однако с fgetpos\fsetpos что-то не клеится... Приведённый ниже код компилируется, но... не работает.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
// В данном примере для произвольного доступа
// к файлу я использую fgetpos и fsetpos.
#include<stdio.h>
#include<stdlib.h>
int main(int argc, char* argv[]){	
	char* fn="./test.txt";
	fpos_t* p=NULL;
	int x = 0;
	FILE* f=fopen(fn,"w+");
		
	fprintf(f,"%s","Vasya, ");
	fflush(f); // прежде чем запомнить позицию 
	// последнего символа, освобождаю буфер
	
	// Запоминаю позицию, в которую будет записан 
	// 'Kolya'	
	if(x=fgetpos(f,p)){
		perror("Error message");
		exit(1);
	}
	
	fprintf(f,"%s","Kolya, Petya.");
	fflush(f); // прежде чем запомнить позицию 
	// последнего символа, освобождаю буфер	
	
	// Меняю 'Kolya' на 'Denis'
	fsetpos(f,p);
	fprintf(f,"%s","Denis");
	fflush(f); // прежде чем запомнить позицию 
	// последнего символа, освобождаю буфер	
		
	fclose(f);
	exit(0);
}



Попытка запуска результата компиляции приводит к следующему результату:
TerminalОшибка сегментирования (сделан дамп памяти)

А в текстовом файле получаю только это:

test.txtVasya,

Что я сделал неверно во втором коде?

Спасибо.
...
Рейтинг: 0 / 0
17.12.2013, 23:24
    #38504374
Compositum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C89: Произвольный доступ к файлу посредством fgetpos\fsetpos
Прошу прощения, вопрос снят (с вечера видимо уже не соображаю). :) Нужно было так делать:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
// В данном примере для произвольного доступа
// к файлу я использую fgetpos и fsetpos.
#include<stdio.h>
#include<stdlib.h>
int main(int argc, char* argv[]){	
	char* fn="./test.txt";
	fpos_t p;
	int x = 0;
	FILE* f=fopen(fn,"w+");
		
	fprintf(f,"%s","Vasya, ");
	fflush(f); // прежде чем запомнить позицию 
	// последнего символа, освобождаю буфер
	
	// Запоминаю позицию, в которую будет записан 
	// 'Kolya'	
	if(x=fgetpos(f,&p)){
		perror("Error message");
		exit(1);
	}
	
	fprintf(f,"%s","Kolya, Petya.");
	fflush(f); // прежде чем запомнить позицию 
	// последнего символа, освобождаю буфер	
	
	// Меняю 'Kolya' на 'Denis'
	fsetpos(f,&p);
	fprintf(f,"%s","Denis");
	fflush(f); // прежде чем запомнить позицию 
	// последнего символа, освобождаю буфер	
		
	fclose(f);
	exit(0);
}



text.txtVasya, Denis, Petya.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / C89: Произвольный доступ к файлу посредством fgetpos\fsetpos / 2 сообщений из 2, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]