Как удалить пробелы в моем текстовом файле с помощью программы c - PullRequest
0 голосов
/ 21 июля 2011

Как мне удалить пробелы в моем текстовом файле? Причина, по которой стоит работать, мой коллега, у него много текстовых файлов с огромным количеством пробелов между ними. Ему становится все труднее удалять их, нажимая backspace. Так что я планировал написать код для этого. И я был успешным до 99%. Проверьте код ниже, который я написал.

#include<stdio.h>

int main()
{
    int b;
    char array[100];
    gets(array); \\ file name to be given here
    FILE *P;
    FILE *T;
    P=fopen(array,"r");
    T=fopen("./duplicate.txt","w");
    for(;(b=getc(P))!=EOF;)
    {
        if(b==32)
        {
            fputc(b,T);
            me:
            b=getc(P);
            if(b==32)
            goto me;
        }
        fputc(b,T);
    }
}

Код работает отлично, но я сделал это путем создания дубликата исходного текстового файла. Но я не хочу создавать дубликаты, я хочу переписать сам исходный файл. Я попробовал это в исходный текстовый файл. Но кое-где, где идет не так.

У меня есть алгоритм, как подойти к нему, как сохранить строки и записать их обратно в файл, но я думаю, что это неэффективный подход. И, ребята, у меня есть сомнения

fputs("\b",filepointer);

создаст ли это забой, я полагаю, нет, это ответ. потому что его запись символа возврата не выполняет операцию возврата. Но я думаю, что здесь будет работать функция ungetc (). Любые идеи будут вознаграждены. Спасибо

Ответы [ 5 ]

1 голос
/ 21 июля 2011

Хотя я бы согласился с другими постерами, для этого есть гораздо лучший выбор, чем С, и у вас есть несколько проблем с безопасностью и дизайном, но я собираюсь ответить на ваш оригинальный вопрос.


Вы не можете напрямую редактировать файл на месте, потому что вы не просто меняете то, что там - вы меняете длину и структуру; из-за этого в какой-то момент вы будете копировать: либо в память, либо во второй файл.
malloc() буфер, который является размером исходного файла (потому что в худшем случае он не может быть больше, в лучшем случае гораздо меньше) и считывает ваши символы в память. Когда закончите, fopen() ваш оригинальный файл с флагом " w " и запишите все обратно. Обычно я рекомендую вам сделать копию, а затем удалить-переименовать, но это не то решение, которое вы готовы принять, основываясь на других ваших комментариях.
Предупреждение, хотя : в то время, когда вы снова открыли свой файл и когда все записали обратно, вы рискуете потерять данные.

1 голос
/ 21 июля 2011

У вас есть серьезные проблемы с безопасностью (gets()), дизайном (goto) и выбором инструментов (на самом деле это работа для языка сценариев) для начала. Но чтобы ответить на ваш вопрос, скопируйте файл duplicate.txt поверх исходного файла.

0 голосов
/ 21 июля 2011

Ты соблазнил меня написать это. Не смотри, если не хочешь спойлеров.

https://gist.github.com/1096670

0 голосов
/ 21 июля 2011

Я понимаю, что вы хотите оттачивать свои навыки C, но если вы установите ruby, вы могли бы помочь своему коллеге с этим однострочником в командной строке, которая редактирует файл на месте:

ruby -p -i -e '$_.squeeze!' file.txt

И если вы хотите создать файл резервной копии с именем file.txt.backup, тогда:

ruby -p -i.backup -e '$_.squeeze!' file.txt

Я думаю, это будет работать, даже если вы в конце укажите несколько имен файлов, так что вы можете получить фантазию:

ruby -p -i -e '$_.squeeze!' *

или

ruby -p -i -e '$_.squeeze!' `find -name '*.txt'`
0 голосов
/ 21 июля 2011

Вы можете открыть файл для чтения / записи и попробовать:

P=fopen(array,"r+");

Подробнее о fopen .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...