как обновить txt файл с помощью c ++ - PullRequest
0 голосов
/ 05 мая 2020

Я хочу обновить данные в моем txt файле, используя c ++, это объясняется:
файл .txt имеет такую ​​форму:

khanh 123456 0
lien 124123 1
hahaha 125225 0

Каждая строка представляет одну учетную запись, первое слово имя пользователя, после - это пароль, а окончательный - статус этого аккаунта (0 - действие, 1 - заблокировано). Пример: строка 2: имя пользователя - lien, пароль - 124123, а статус - 1
. И я хочу обновить статус одной учетной записи по ее имени пользователя.
Пример: i, что изменить статус аккаунта hahaha от 0 до 1, когда у меня есть строка (или массив char), содержащая строку hahaha (например: string = "hahaha" или char * arry = "hahaha")
Как Могу ли я сделать это, я нахожу какое-то решение, и оно просто переопределяет первую строку в файле txt, кто-нибудь может мне помочь, как обновить символ в файле .txt, как это.

Ответы [ 3 ]

1 голос
/ 05 мая 2020

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

#include <iostream>
#include <fstream>

int main(void)
{
    std::ifstream file;
    std::ofstream out;

    std::string str;
    short int status; // status = 0, 1
    int bal, i = 1;

    file.open("test.txt"); // opening test.txt
    out.open("output.txt"); // opening output.txt here, otherwise it'll iterate in loop

    // gets input in this format
    while (file >> str >> bal >> status)
    {
        std::cout << "[" << i << "] " << str << ' ' << bal << ' ' << status << std::endl;

        std::cout << "Account status for this person (1 or 0): ";
        std::cin >> status;
        out << str << ' ' << bal << ' ' << status << std::endl;

        i++;
    }

    file.close();
    out.close();

    return 0;
}

Создано ifstream для чтения и ofstream для записи данных в папку output.txt. Вы можете увидеть следующий пример вывода:

Пример вывода

[1] khanh 123456 0
Account status for this person (1 or 0): 1
[2] lien 124123 1
Account status for this person (1 or 0): 0
[3] hahaha 125225 0
Account status for this person (1 or 0): 0

Затем вы должны получить это в output.txt:

khanh 123456 1
lien 124123 0
hahaha 125225 0

Наслаждайтесь!

0 голосов
/ 05 мая 2020

Это мой короткий код с использованием seekp и tellg:

#include <fstream>
#include <iostream>
#include <string>

int main() {
    std::fstream file("data.txt", std::ios::in | std::ios::out);
    std::string user, pass, query;
    char status;
    std::cin >> query; // input the user whose status you wanna toggle
    while (file >> user >> pass)
        if (user == query) {
            auto pos = file.tellg();
            file >> status;
            file.seekp(pos);
            file << (status == '0' ? '1' : '0');
            break;
        } else {
            file >> status;
        }
    file.close();
    return 0;
}
0 голосов
/ 05 мая 2020

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

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

char name[]="hahaha";
char newvalue='1';

int main(void)
{
   FILE* filePtr = fopen("try.txt", "r+");
   char c;
   bool isvalidname=true;
   int name_idx=0;
   while((c = fgetc(filePtr)) != EOF)
   {
       if(c == '\n')
       {
           isvalidname=true;
       }
       if(c == '\r' || c=='\n')
       {
           continue;
       }

       if( isvalidname && ( name_idx + 1 == strlen(name)))
       {
           isvalidname = false;
       }

       if( isvalidname && (name_idx< strlen(name) && name[name_idx]!=c))
       {
           isvalidname = false;
       }
       if(isvalidname)
       {
           name_idx++;
       }

       if(isvalidname && (name_idx == strlen(name) -1))
       {
           int spaces=0;
           while((c = fgetc(filePtr)) != EOF)
           {
                if(c==' ') spaces++;
                if(spaces==2) 
                {
                    fseek(filePtr, 0, SEEK_CUR);
                    fputc(newvalue, filePtr);
                    break;
                }
           }
       }

   }
   fclose(filePtr);
   return 0;
}
...