Удаление/замещение пропуска в текстовом файле. Скорость - главный фактор - C (СИ)
Формулировка задачи:
Здравствуйте,
стоит следующая задача - нужно быстро(мах. 100ms) из текстового файла (1GB) удалить все пропуски или сделать их не видимыми.
Решение задачи путем - сдвига всего массива после удаляемого на один байт влево, так чтобы удаляемый был перезаписан следующим, следующий следующим за ним и тд. не подходит (процесс долгий и требует много ресурсов).
Поэтому был выбран др. путь - я нашел положение всех пропусков в файле(5-8ms). Теперь у меня есть массив того что я должен удалить. Как было задумано к сожалению не получается.
Вопросы:
(1) Не могу найти в Win32API функцию удаления массива из массива(за один interaction). Есть такая функция или я ищу черную кошку в темной комнате, а ее там и вообще нет?
(2) Подскажите, как выделить/отметить в текстовом файле байты как удаленные, не удаляя их?
Т.е. я думал, что если я значение 32 (пропуск) заменю на 0 bit то этот байт станет не видимым. К сожалению текстовой редактор видит 0 bit и показывает его как пропуск.
Есть ли теоретически возможность создания невидимого байта в текстовом файле? Если да, то такой формат нужен и путем такого замещения? Я делал с 8-bit intenger 1D-Array.
Заранее благодарен, за конструктивные советы.
Решение задачи: «Удаление/замещение пропуска в текстовом файле. Скорость - главный фактор»
textual
Листинг программы
int pressArr(int *Arr, int n) { int i_from,i_to; i_to=0; for (i_from=0; i_from<n; i_from++) if (Arr[i_from]) Arr[i_to++]=Arr[i_from]; return i_to; } int main(int argc, char *argv[]) { int X[]={1,2,0,0,3,4,0,0,0,-7,0,-7,8,9,10,0}; int i,n,m; n=sizeof(X)/sizeof(int); m=pressArr(X,n); for (i=0;i<m;i++) printf("%d ",X[i]); printf("\n"); system("PAUSE"); return 0; }
Объяснение кода листинга программы
В данном коде представлен алгоритм удаления/замещения пропусков в массиве (в данном случае, в текстовом файле) с сохранением порядка следования элементов без пропусков.
- *int pressArr(int Arr, int n) - функция, которая принимает на вход массив целых чисел и его размер.
1.1. int i_from,i_to; - временные переменные для обозначения индексов начала и конца текущего
непустого
участка массива. 1.2. i_to=0; - инициализация счетчика длянепустых
элементов массива. 1.3. for (i_from=0; i_from<n; i_from++) - цикл по всем элементам массива. 1.4. if (Arr[i_from]) Arr[i_to++]=Arr[i_from]; - если элемент массива не равен нулю (т.е. оннепустой
), то он копируется внепустой
участок массива с увеличением счетчиканепустых
элементов. 1.5. return i_to;** - возвращает количествонепустых
элементов в массиве. - *int main(int argc, char argv[]) - главная функция программы.
2.1. int X[]={1,2,0,0,3,4,0,0,0,-7,0,-7,8,9,10,0}; - массив целых чисел, в котором необходимо удалить/заменить пропуски.
2.2. int i,n,m; - временные переменные для обозначения индексов и размеров массива.
2.3. n=sizeof(X)/sizeof(int); - вычисление размера массива в байтах и его приведение к размеру в элементах.
2.4. m=pressArr(X,n); - вызов функции для удаления/замены пропусков в массиве.
2.5. for (i=0;i<m;i++) printf(
%d
,X[i]); - вывод на экраннепустых
элементов массива. 2.6. printf(\n
); - переход на новую строку. 2.7. system(PAUSE
); - остановка программы нажатием клавишиВвод
. 2.8. return 0;** - завершение работы программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д