Поменять местами слова в файле
С файлами понятно. Загрузилась на словах про дополнительные массивы: то есть если даже в строку из файла не считывать, то как это сделать, в самом файле?? Предполагаю, что позиции как-то менять надо, но вот с этим проблема...
- А не прокатит прочитать в буфер первое слово, а потом дописать в его начало второе?.. Ну а потом записать это в файл... от transParent, 30 декабря 2013 года
Хранились бы слова в массиве, а не в файле, можно было б задействовать арифметику указателей и их разыменовывание, например. А для файла аналог указателя - итератор. Дальше сами.
я, конечно, понимаю, что всё гениальное просто, но буфер - это же массив будет, я так понимаю?)
Код:
#include <stdio.h>
// только для ASCII-слов
int main(void){
FILE* fp = fopen("word2.txt", "rt+");
if(fp == NULL)
return 1;
int a, b;
long pa, pb, la, lb;
//позиция 1-ого слова
fscanf(fp, "%*[^a-zA-Z]");
pa = ftell(fp);
fscanf(fp, "%*[a-zA-Z]");
la = ftell(fp) - pa;
// позиция 2-ого слова
fscanf(fp, "%*[^a-zA-Z]");
pb = ftell(fp);
fscanf(fp, "%*[a-zA-Z]");
lb = ftell(fp) - pb;
// посимвольная перезапись(обмен)
for(long i = (la < lb) ? la : lb; i > 0L; --i){
fseek(fp, pa, SEEK_SET);
a = fgetc(fp);
fseek(fp, pb, SEEK_SET);
b = fgetc(fp);
fseek(fp, -1L, SEEK_CUR);
fputc(a, fp);
pb = ftell(fp);
fseek(fp, pa, SEEK_SET);
fputc(b, fp);
pa = ftell(fp);
}
//если 2-ое слово больше 1-oго
long ia, ib;
if(lb > la) {
--pa;
for(long i = lb - la; i > 0L; --i, ++pa, ++pb) {
ib = pb;
fseek(fp, pb - 1, SEEK_SET);
while(pa < ib) {
a = fgetc(fp);
b = fgetc(fp);
fseek(fp, -2L, SEEK_CUR);
fputc(b, fp);
fputc(a, fp);
fseek(fp, -3L, SEEK_CUR);
ib = ftell(fp);
}
}
} else if(la > lb) { // если 1-ое слово больше 2-oго
for(long i = la - lb; i > 0L; --i) {
ia = pa;
fseek(fp, pa, SEEK_SET);
while(ia < pb - 1) {
a = fgetc(fp);
b = fgetc(fp);
fseek(fp, -2L, SEEK_CUR);
fputc(b, fp);
fputc(a, fp);
fseek(fp, -1L, SEEK_CUR);
ia = ftell(fp);
}
}
}
fclose(fp);
return 0;
}
// только для ASCII-слов
int main(void){
FILE* fp = fopen("word2.txt", "rt+");
if(fp == NULL)
return 1;
int a, b;
long pa, pb, la, lb;
//позиция 1-ого слова
fscanf(fp, "%*[^a-zA-Z]");
pa = ftell(fp);
fscanf(fp, "%*[a-zA-Z]");
la = ftell(fp) - pa;
// позиция 2-ого слова
fscanf(fp, "%*[^a-zA-Z]");
pb = ftell(fp);
fscanf(fp, "%*[a-zA-Z]");
lb = ftell(fp) - pb;
// посимвольная перезапись(обмен)
for(long i = (la < lb) ? la : lb; i > 0L; --i){
fseek(fp, pa, SEEK_SET);
a = fgetc(fp);
fseek(fp, pb, SEEK_SET);
b = fgetc(fp);
fseek(fp, -1L, SEEK_CUR);
fputc(a, fp);
pb = ftell(fp);
fseek(fp, pa, SEEK_SET);
fputc(b, fp);
pa = ftell(fp);
}
//если 2-ое слово больше 1-oго
long ia, ib;
if(lb > la) {
--pa;
for(long i = lb - la; i > 0L; --i, ++pa, ++pb) {
ib = pb;
fseek(fp, pb - 1, SEEK_SET);
while(pa < ib) {
a = fgetc(fp);
b = fgetc(fp);
fseek(fp, -2L, SEEK_CUR);
fputc(b, fp);
fputc(a, fp);
fseek(fp, -3L, SEEK_CUR);
ib = ftell(fp);
}
}
} else if(la > lb) { // если 1-ое слово больше 2-oго
for(long i = la - lb; i > 0L; --i) {
ia = pa;
fseek(fp, pa, SEEK_SET);
while(ia < pb - 1) {
a = fgetc(fp);
b = fgetc(fp);
fseek(fp, -2L, SEEK_CUR);
fputc(b, fp);
fputc(a, fp);
fseek(fp, -1L, SEEK_CUR);
ia = ftell(fp);
}
}
}
fclose(fp);
return 0;
}
APL+++[]+++AppleTalk
Цитата: xAtom
Например в файле содержатся два слова:
APL+++[]+++AppleTalk
ого. нет сейчас времени проверять на рабочесть, но выглядит логично. спасибо.