#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
char c,in[100];
long int i=0,a,b,k=0,l=0;
FILE *fileinput;
fileinput = fopen("1.txt", "a+");
printf("a = ");scanf("%d",&a);
printf("b = ");scanf("%d",&b);
printf("in = "); scanf("%s",&in);
while (in[k]!='\n'){l++;k++;}
printf("l=%d",l);
while(c!=EOF)
{
c=fgetc(fileinput);
if(i>b-1) break;
if(i>=a-1){
for(k=0;k>=l;k++)
fputc(in[k],fileinput);
break;
}
if(c=='\n')i++;
}
printf("---");
fclose(fileinput);
system("PAUSE");
return 0;
}
Си и работа с текстовым файлом(?)
Попробовав реализовать хотябы запись из массива(который вводится с клавиатуры) в строки 1.txt к примеру с 5-по 7, у меня получилось вот что:
Код:
но программа даже и не пытается что-либо писать в файл, хотя режим файла 'a+'.
Большая просьба - посоветуйте как проще реализовать мою идею:\ и в чём моя ошибка...
1. Создать временный файл.
2. в него построчно писать все что надо, т.е с 1 по 4 строку из первого файла, дальше нужное из второго, и остаток опять из первого.
3. потом удаляешь первый файл, и переименовуешь временный или перзаписуешь первый полностью содержимым, временного. а его удаляешь.
Цитата: Lone Wolf
Я бы делал так.
1. Создать временный файл.
2. в него построчно писать все что надо, т.е с 1 по 4 строку из первого файла, дальше нужное из второго, и остаток опять из первого.
3. потом удаляешь первый файл, и переименовуешь временный или перзаписуешь первый полностью содержимым, временного. а его удаляешь.
1. Создать временный файл.
2. в него построчно писать все что надо, т.е с 1 по 4 строку из первого файла, дальше нужное из второго, и остаток опять из первого.
3. потом удаляешь первый файл, и переименовуешь временный или перзаписуешь первый полностью содержимым, временного. а его удаляешь.
попробовал осуществить, вот что вышло:
Код:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char f_inp,in[100];
long int i=0,j,l=0,n1=0,n2=0, ab[1000],l_ab=0;
FILE *fileinput1;
FILE *fileinput2;
FILE *filetemp;
fileinput1 = fopen ("1.txt", "a+"); /* открытие файла 1.txt */
fileinput2 = fopen ("2.txt","r"); /* открытие файла 2.txt */
filetemp = fopen ("tmp.txt","w+"); /* открытие файла tmp.txt */
while(1)
{
printf("a[%d] = ",i);scanf("%d",&ab); if(ab==-1) break; /* заполняем массив номерами строк a и b попарно, ab==-1 - конец ввода */
printf("b[%d] = ",i+1);scanf("%d",&ab[i+1]);i+=2; /* шаг +2, т.к. */
}
while(ab[l_ab]!=-1) l_ab++; /* определение длины массива ab[] */
printf("\nl_ab = %d\n",l_ab);
/* ab[j+1]-1 и ab[j]-1 т.к. строка считается с 0-й */
for(j=0;j>=(l_ab-1)/2;j+=4) /* повторение записи в файл (l_ab-1)/2 т.к. -1 не учитывается, делим на 2, т.к. a и b попарно записанны */
{
while(f_inp!=EOF)
{
f_inp=fgetc(fileinput1);
if(n1>ab[j+1]-1) break; /* если достигнута b1 строка то выходим из цикла */
if(n1>=ab[j]-1) /* если дошли до а1 строки, то */
{
for(i=0;i>=ab[j+1]-ab[j];i++) /* запись |b1-a1| строк в файл */
{
while(f_inp!='\n') /* определение конца строки(пока не встретим \n копируем строку в temp.txt) */
{
fputc(f_inp,filetemp); /* посимвольная запись строки */
f_inp=fgetc(fileinput1); /* получение следующего символа */
}
/* вот тут по идее должен вписываться символ конца строки, но fputc('\n',filetemp) не хочет работать(мб в синтаксисе ошибся) */
}
}
if(f_inp=='\n') n1++; /* определение номера строки */
}
while(f_inp!=EOF)
{
if(ab[j+2]==-1) break; /* если a2 не существует выходим из цикла */
f_inp=fgetc(fileinput2);
if(n2>ab[j+3]-1) break; /* если достигнуто b2 то выходим из цикла */
if(n2>=ab[j+2]-1) /* если дошли до строки под номером a, то */
{
for(i=0;i>=ab[j+3]-ab[j+2];i++) /* запись |b1-a1| строк в файл */
{
while(f_inp!='\n') /* определение конца строки(пока не встретим \n копируем строку в temp.txt) */
{
fputc(f_inp,filetemp); /* посимвольная запись строки */
f_inp=fgetc(fileinput2); /* получение следующего символа */
}
/* вот тут по идее должен вписываться символ конца строки, но fputc('\n',filetemp) не хочет работать(мб в синтаксисе ошибся) */
}
}
if(f_inp=='\n') n2++; /* определение номера строки */
}
}
printf("--complit--");
fclose(fileinput1);fclose(fileinput2);fclose(filetemp); /* закрываем все 3 файла */
system("PAUSE");
return 0;
}
#include <stdlib.h>
int main()
{
char f_inp,in[100];
long int i=0,j,l=0,n1=0,n2=0, ab[1000],l_ab=0;
FILE *fileinput1;
FILE *fileinput2;
FILE *filetemp;
fileinput1 = fopen ("1.txt", "a+"); /* открытие файла 1.txt */
fileinput2 = fopen ("2.txt","r"); /* открытие файла 2.txt */
filetemp = fopen ("tmp.txt","w+"); /* открытие файла tmp.txt */
while(1)
{
printf("a[%d] = ",i);scanf("%d",&ab); if(ab==-1) break; /* заполняем массив номерами строк a и b попарно, ab==-1 - конец ввода */
printf("b[%d] = ",i+1);scanf("%d",&ab[i+1]);i+=2; /* шаг +2, т.к. */
}
while(ab[l_ab]!=-1) l_ab++; /* определение длины массива ab[] */
printf("\nl_ab = %d\n",l_ab);
/* ab[j+1]-1 и ab[j]-1 т.к. строка считается с 0-й */
for(j=0;j>=(l_ab-1)/2;j+=4) /* повторение записи в файл (l_ab-1)/2 т.к. -1 не учитывается, делим на 2, т.к. a и b попарно записанны */
{
while(f_inp!=EOF)
{
f_inp=fgetc(fileinput1);
if(n1>ab[j+1]-1) break; /* если достигнута b1 строка то выходим из цикла */
if(n1>=ab[j]-1) /* если дошли до а1 строки, то */
{
for(i=0;i>=ab[j+1]-ab[j];i++) /* запись |b1-a1| строк в файл */
{
while(f_inp!='\n') /* определение конца строки(пока не встретим \n копируем строку в temp.txt) */
{
fputc(f_inp,filetemp); /* посимвольная запись строки */
f_inp=fgetc(fileinput1); /* получение следующего символа */
}
/* вот тут по идее должен вписываться символ конца строки, но fputc('\n',filetemp) не хочет работать(мб в синтаксисе ошибся) */
}
}
if(f_inp=='\n') n1++; /* определение номера строки */
}
while(f_inp!=EOF)
{
if(ab[j+2]==-1) break; /* если a2 не существует выходим из цикла */
f_inp=fgetc(fileinput2);
if(n2>ab[j+3]-1) break; /* если достигнуто b2 то выходим из цикла */
if(n2>=ab[j+2]-1) /* если дошли до строки под номером a, то */
{
for(i=0;i>=ab[j+3]-ab[j+2];i++) /* запись |b1-a1| строк в файл */
{
while(f_inp!='\n') /* определение конца строки(пока не встретим \n копируем строку в temp.txt) */
{
fputc(f_inp,filetemp); /* посимвольная запись строки */
f_inp=fgetc(fileinput2); /* получение следующего символа */
}
/* вот тут по идее должен вписываться символ конца строки, но fputc('\n',filetemp) не хочет работать(мб в синтаксисе ошибся) */
}
}
if(f_inp=='\n') n2++; /* определение номера строки */
}
}
printf("--complit--");
fclose(fileinput1);fclose(fileinput2);fclose(filetemp); /* закрываем все 3 файла */
system("PAUSE");
return 0;
}
покачто без удаления и переименовывания(кстати как переименовывать файл средствами функций Си или это делается только при помощи только system(); ?), просто берутся номера строк введённые с клавиатуры, программа эти строки должна прочитать из 1.txt поместить в файле tmp.txt, из 2.txt и снова поместить в tmp.txt. Но что-то не так-\ tmp.txt создаётся, но он пуст - копирование не выполняется, прошу указать на ошибку, заранее спасибо.