Как заменить текст на конкретное местоположение файла, передав аргумент через аргумент командной строки

Тот же вопрос: How-to-update-the-gui-from-another-thread-in-c

Two Ways:

  1. Возвращаемое значение в e.result и использовать его для установки значения вашего текстового поля в backgroundWorker_RunWorkerCompleted event
  2. Объявить некоторую переменную для хранения этих значений в отдельном классе (который будет работать как держатель данных). Создайте статический экземпляр этого класса и вы можете получить к нему доступ по любому потоку.

Пример:

public  class data_holder_for_controls
{
    //it will hold value for your label
    public  string status = string.Empty;
}

class Demo
{
    public static  data_holder_for_controls d1 = new data_holder_for_controls();
    static void Main(string[] args)
    {
        ThreadStart ts = new ThreadStart(perform_logic);
        Thread t1 = new Thread(ts);
        t1.Start();
        t1.Join();
        //your_label.Text=d1.status; --- can access it from any thread 
    }

    public static void perform_logic()
    {
        //put some code here in this function
        for (int i = 0; i < 10; i++)
        {
            //statements here
        }
        //set result in status variable
        d1.status = "Task done";
    }
}

0
задан udaya chandran 13 July 2018 в 03:56
поделиться

2 ответа

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

Чтобы безопасно изменить содержимое файла, прочитайте все содержимое файла в памяти, внесите необходимые изменения и затем обрезайте текущий файл и запишите новое содержимое в усеченный файл. (если файл слишком велик для операций с памятью, затем используйте временный файл)

Вы не хотите использовать atoi для преобразования строки "1567" в целое число. Вы заменяете символы в файле, а не целочисленные значения в двоичном файле, поэтому работайте с символами.

Ваш проект осложнен только желанием заменить текст после первого '='. Это может быть или не быть в первой строке файла, поэтому вам понадобится некоторый флаг, указывающий, когда будет найден первый '=' и будет произведена замена. (после того, как замена выполнена, вы можете просто сломать цикл чтения и закрыть файл, но ниже примера вывести все строки для удобства)

Каждый раз, когда вы закрываете файл после записи , вы должны проверить возврат fclose, чтобы поймать любые ошибки потока или ошибки, возникшие при последней записи, которые не будут очевидны до следующей операции с файлом.

С этими предупреждениями и Предостережения, вы можете сделать что-то похожее на:

#include <stdio.h>
#include <string.h>

#define MAXSIZE 64          /* max line/buffer size */
#define FNAME "logic.txt"   /* default file name */
#define REPLACE "1567"      /* default replacement text */

int main (int argc, char **argv) {

    char buf[MAXSIZE] = "";         /* line buffer */
    const char *str = argc > 1 ? argv[1] : REPLACE; /* replacement string */
    int replaced = 0;               /* flag indicating replacement made */
    FILE *fp = fopen (FNAME, "r+"); /* open file reading/writing */

    if (!fp) {  /* validate file open for reading/writing */
        perror ("fopen-FNAME");
        return 1;
    }

    while (fgets (buf, MAXSIZE, fp)) {  /* read each line in file */
        if (!replaced) {                /* if replacement not yet made */
            char *p = strchr (buf, '=');    /* search for '=' in line */
            if (p) {                        /* if found */
                size_t plen = 0;            /* var for length to end */
                p++;                        /* advance past '=' sign */
                plen = strlen (p);          /* get length to end  */

                if (plen < strlen (str)) {  /* check avail length */
                    fprintf (stderr, "error: not enough space in line.\n");
                    return 1;
                }
                strcpy (p, str);                    /* copy str to p */
                if (fseek (fp, -plen, SEEK_CUR)) {  /* backup plen chars */
                    perror ("fseek(fp)");
                    return 1;
                }
                fputs (p, fp);  /* overwite contents with replacement */
                replaced = 1;   /* set flag indicating replacement   */
            }                   /* (you can break, and remove output */
        }                       /*  here if not writing to stdout)   */
        fputs (buf, stdout);    /* output lines to stdout (optional) */
    }
    if (fclose (fp) == EOF)     /* always validate close-after-write */
        perror ("fclose-FNAME");

    return 0;
}

Используя ваш файл logic.txt в качестве примера ввода и назвав исполняемый файл filelogic, как вы, использование и действие кода выше дает:

logic.txt Файл Before

$ cat logic.txt
one=1234

two=3456

Пример использования / вывода

$ ./filelogic
one=1567

two=3456

файл logic.txt После

$ cat logic.txt
one=1567

two=3456

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

2
ответ дан David C. Rankin 17 August 2018 в 13:42
поделиться
  • 1
    Спасибо большое Rankin ... Логика очень хорошая – udaya chandran 13 July 2018 в 11:45
  • 2
    Рад помочь. Это хорошие учебные упражнения, потому что они заставляют вас включать вашу учетную шляпу и учитывать, достаточно ли места в строке для замены (вы должны подходить ко всему использованию памяти и ввода-вывода с тем же вниманием к каждому байту). Удачи вам в кодировании. – David C. Rankin 14 July 2018 в 00:31
  • 3
    Вам нужно ваше предложение о реализации, приведенное ниже – udaya chandran 18 July 2018 в 13:51

Я переписываю код, чтобы извлечь целочисленное значение и сохранить его в char array [].

Когда я это делаю, перед некоторыми проблемами

    #define MAXSIZE 64          /* max line/buffer size */
    #define FNAME "logic.txt"   /* default file name */
    //#define REPLACE "1567"      /* default replacement text */

    int main (int argc, char **argv) {

        char buf[MAXSIZE] = "";         /* line buffer */
    //    const char *str = argc > 1 ? argv[1] : argv[1]; /* replacement string */

          char buff[16];
          int num =1567;
          sprintf(buff,"%d",num);


        int replaced = 0;               /* flag indicating replacement made */
        FILE *fp = fopen (FNAME, "r+"); /* open file reading/writing */

        if (!fp) {  /* validate file open for reading/writing */
            perror ("fopen-FNAME");
            return 1;
        }

        while (fgets (buf, MAXSIZE, fp)) {  /* read each line in file */
            if (!replaced) {                /* if replacement not yet made */
                char *p = strchr (buf, '=');    /* search for '=' in line */
                if (p) {                        /* if found */
                    size_t plen = 0;            /* var for length to end */
                    p++;                        /* advance past '=' sign */
                    plen = strlen (p);          /* get length to end  */

    /*                if (plen < strlen (buff)) {}
    */
                   // strcpy (p, str);                    /* copy str to p */
                     p = buff;
                    if (fseek (fp, -plen, SEEK_CUR)) {
                        perror ("fseek(fp)");
                        return 1;
                    }

                    fputs (p, fp);  /* overwite contents with replacement */
                    replaced = 1;   /* set flag indicating replacement   */
                }                   /* (you can break, and remove output */
            }                       /*  here if not writing to stdout)   */
    //        fputs (buf, stdout);    /* output lines to stdout (optional) */
        }
        if (fclose (fp) == EOF)     /* always validate close-after-write */
            perror ("fclose-FNAME");

        return 0;
    }

Мне также нужна такая же функциональность. Но я получаю такую ​​проблему, когда я делаю ошибки

        input file
        one=14
        two=2345

        expected output:
        one=1567
        two=2345

        But i am getting output like this

        one=1567wo=2345


In which way,i can achieve this functionality in these kind of scenario?
0
ответ дан udaya chandran 17 August 2018 в 13:42
поделиться
  • 1
    Где ваша учетная шляпа ? Это заблудилось? Вы пытаетесь заменить "14" на "1567"? Вы пытаетесь втиснуть 4-символьные символы, где есть только место для двух символов? 4-символьное содержимое файла перед заменой (начиная с "14") на самом деле "14\nt", поэтому, когда вы пишете 1567, вы переписываете newline` и 't', а также - что точно что вы видите в своем выпуске. Вот почему попытка изменить файл на месте - это хорошая практика , но действительно плохая идея. – David C. Rankin 18 July 2018 в 19:54
  • 2
    да, я понимаю .. Но я хочу заменить значение, которое присутствует после & quot; = & quot; в файле. Независимо от того, что это может быть 1 или 14 .., его следует заменить на 1567, не затрагивая вторую строку в файле .... мы пытаемся сделать это для изучения сакэ .. будет ли возможно сделать это ? – udaya chandran 19 July 2018 в 05:53
  • 3
    Для этого вам необходимо прочитать весь текст в памяти или прочитать и отредактировать каждую строку по строке, а также вывести на новый файл, а не тот, который вы читаете. Таким образом, вы, как правило, хотите открыть один поток файлов для ввода (например, ifp = fopen ("infile.txt", "r");) и один поток для вывода (например, ofp = fopen ("outfile.txt", "w");) и ваше чтение из ifp и записать в ofp. В противном случае просто прочитайте и запишите весь файл в память, а затем закройте файл и снова запустите "w" и напишите информацию, хранящуюся в памяти, в файл. – David C. Rankin 19 July 2018 в 06:07
Другие вопросы по тегам:

Похожие вопросы: