fstream io("111.txt", ios::ate | ios::out | ios::in);
char ch = 0;
char szNewStr[] = "new world";
int iKol = (int)strlen(szNewStr);
int iPos = io.tellg();
while(iPos-- > 0)
{
io.seekg(iPos, ios::beg);
io>>ch;
io.seekg(iPos + iKol, ios::beg);
io<<ch;
}
io.seekg(0, ios::beg);
io<<szNewStr;
io.close();
Как писать в любое место в файл?
Как писать в любое место в файл? Я открываю FILE* fp=fopen(filename,"a+");читаю и позиционируюсь в начало файла. Но пишется только в конец файла. Нужно, чтобы это все на чистом Си.
А почему бы не использовать файловые потоки? fstream?
Да, забыл, мне нужно писать все на чистом СИ.
Попоробуй после открытия перейти в конец файла, только потом в позицию для записи. Возможно после первого перехода надо будет сделать fflush()
fseek
int p=123;
FILE* fp=fopen(filename,"a+");
fseek(fp,0l,SEEK_SET);
fwrite(&p,sizeof(p),1,fp);
fclose(fp);
Но пишется в конец файла.Если открывать файл с "r+" вместо "a+", то размер файла не увеличивается, но писать могу куда угодно.
Вообще моя задача состоит в том, чтобы в начало записать массив файловых указателей на строки в файле. Поэтому мне нужно организовать сдвиг содержимого файла на длину массива, следовательно размер файла увеличится.
Повторюсь, что писать мне нужно на чистом Си.
Цитата: Sourcer
Я делаю так:
int p=123;
FILE* fp=fopen(filename,"a+");
fseek(fp,0l,SEEK_SET);
fwrite(&p,sizeof(p),1,fp);
fclose(fp);
Но пишется в конец файла.Если открывать файл с "r+" вместо "a+", то размер файла не увеличивается, но писать могу куда угодно.
Вообще моя задача состоит в том, чтобы в начало записать массив файловых указателей на строки в файле. Поэтому мне нужно организовать сдвиг содержимого файла на длину массива, следовательно размер файла увеличится.
Повторюсь, что писать мне нужно на чистом Си.
int p=123;
FILE* fp=fopen(filename,"a+");
fseek(fp,0l,SEEK_SET);
fwrite(&p,sizeof(p),1,fp);
fclose(fp);
Но пишется в конец файла.Если открывать файл с "r+" вместо "a+", то размер файла не увеличивается, но писать могу куда угодно.
Вообще моя задача состоит в том, чтобы в начало записать массив файловых указателей на строки в файле. Поэтому мне нужно организовать сдвиг содержимого файла на длину массива, следовательно размер файла увеличится.
Повторюсь, что писать мне нужно на чистом Си.
Хм, при r+ размер меняется если при записи ты выходишь за границы файла.
В твоем случае, ничего не остается как "вручную развигать" файл, что не есть гуд если файл большой. Как я понял, ты хочешь реализовать что-то типа индекса. Тогда не проще ли создать отдельный файл индексов, где хранятся указатели на строки в твоем файле?
Код:
FILE *file = fopen("111.txt", "r+");
int iPos;
char ch1 = 0;
char ch2 = 0;
bool bFinish = false;
char szNewStr[] = "new world";
int iKol = iPos = (int)strlen(szNewStr);
do{
if (ch2 == EOF)bFinish = true;
for (int i = 0; i < iKol; i++)
{
fseek(file, i, SEEK_SET);
ch1 = fgetc(file);
fseek(file, iPos + i, SEEK_SET);
ch2 = fgetc(file);
if (ch1 != EOF)
{
fseek(file, iPos + i, SEEK_SET);
fputc(ch1, file);
}
fseek(file, i, SEEK_SET);
fputc(ch2, file);
}
iPos += iKol;
}while(!bFinish);
rewind(file);
fprintf(file, "%s", szNewStr);
fclose(file);
int iPos;
char ch1 = 0;
char ch2 = 0;
bool bFinish = false;
char szNewStr[] = "new world";
int iKol = iPos = (int)strlen(szNewStr);
do{
if (ch2 == EOF)bFinish = true;
for (int i = 0; i < iKol; i++)
{
fseek(file, i, SEEK_SET);
ch1 = fgetc(file);
fseek(file, iPos + i, SEEK_SET);
ch2 = fgetc(file);
if (ch1 != EOF)
{
fseek(file, iPos + i, SEEK_SET);
fputc(ch1, file);
}
fseek(file, i, SEEK_SET);
fputc(ch2, file);
}
iPos += iKol;
}while(!bFinish);
rewind(file);
fprintf(file, "%s", szNewStr);
fclose(file);
вот на чистом си. я правда непомню но вроде в си нет функции получения размера файла, если бы была такова, код был бы меньше, по аналогии с моим придыдущим примером