我想用c++更新我的txt文件中的数据,这是解释:
文件.txt的格式如下:
khanh 123456 0
lien 124123 1
hahaha 125225 0
每一行代表一个帐户,第一个字是用户名,第二个是密码,最后一个是该帐户的状态(0是活动,1是阻止(。例如:第2行:用户名是lien
,密码是124123
,状态是1
我想根据用户名更新一个帐户的状态
Ex:i当字符串(或数组char(包含字符串hahaha
(Ex:string="hahaha"或char*arry="haha哈"(时,如何将hahaha
的状态从0
更改为1
我该怎么做,我找到了一些解决方案,它只覆盖了txt文件中的第一行,有人可以帮助我,如何像这样更新.txt文件中的字符。
这是我使用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;
}
请注意,您不能覆盖该文件。另一种解决方案只是获取指定格式的数据,并生成编辑版本的输出。这是我为您的需求编码的:
#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
享受吧!
您可以在读写模式下打开文件。请记住,如果您想更新长度与旧值不同的值,您需要移动下面的所有数据,或者只需添加空格以适应固定长度。
#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;
}