Удаление/замещение пропуска в текстовом файле. Скорость - главный фактор - 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;
}

Объяснение кода листинга программы

В данном коде представлен алгоритм удаления/замещения пропусков в массиве (в данном случае, в текстовом файле) с сохранением порядка следования элементов без пропусков.

  1. *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;** - возвращает количество непустых элементов в массиве.
  2. *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;** - завершение работы программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 3.75 из 5
Похожие ответы