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

Произвольный доступ к файлу можно осуществлять либо посредством 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
C89: Произвольный доступ к файлу посредством fgetpos\fsetpos
    #38504374
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошу прощения, вопрос снят (с вечера видимо уже не соображаю). :) Нужно было так делать:
Код: 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
2 сообщений из 2, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / C89: Произвольный доступ к файлу посредством fgetpos\fsetpos
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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