如何使用 C++ 在 .txt 文件中写入、读取和重写

Posted

技术标签:

【中文标题】如何使用 C++ 在 .txt 文件中写入、读取和重写【英文标题】:how to write, read and rewrite in a .txt file with c++ 【发布时间】:2015-01-30 22:30:49 【问题描述】:

我是一名学生,我必须创建一个程序并告知该程序的使用,所以如果文件不存在,我必须创建它;如果存在,则读取并保存变量,如果满足特定条件则必须增加其值,最后程序必须用新值重写文件,保存并关闭它。我做了一个代码,但效果不好,我不知道错误在哪里。请帮帮我。

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <iomanip>
#include <fstream>
#include <string>
using namespace std;

int main()


int varAux1,varAux2,varAux3,varAux4;
int a;
int var1,var2,var3,var4;


ifstream archivoLectura;
archivoLectura.open("informeuso.txt");


    if (archivoLectura.fail())
    
        ofstream archivoLectura;
        archivoLectura.open("informeuso.txt");

            archivoLectura<<"linea 1: "<<0<<"\n";
            archivoLectura<<"linea 2: "<<0<<"\n";
            archivoLectura<<"linea 3: "<<0<<"\n";
            archivoLectura<<"linea 4: "<<0<<"\n";

        archivoLectura.close();
        archivoLectura.open("informeuso.txt");

    


    archivoLectura>>var1;
    archivoLectura>>var2;
    archivoLectura>>var3;
    archivoLectura>>var4;


    varAux1 = var1;
    varAux2 = var2;
    varAux3 = var3;
    varAux4 = var4;


archivoLectura.close();


cout<<"hola"<<endl;
cout<<"programa prueba"<<endl;
cout<<"enter value from 0 to 9"<<endl;
cout<<"a: ";
cin >> a;



if (a>0 && a <3)


    var1 = varAux1 + 1;

else if(a>2 && a <6)


    var2 = varAux2 + 1;


else if (a>5 && a<8)

    var3 = varAux3 +1;


else

    var4 = varAux4 + 1;



ofstream archivoEscritura;
archivoEscritura.open("informeuso.txt");

    archivoEscritura<<"line 1-2: "<<var1<<"\n";
    archivoEscritura<<"line 3-5: "<<var2<<"\n";
    archivoEscritura<<"line 6-7: "<<var3<<"\n";
    archivoEscritura<<"line other: "<<var4<<"\n";

archivoEscritura.close();

system("pause");
return 0;

【问题讨论】:

告诉我们为什么它不起作用 “但效果不好” 这不是一个非常详细、准确的描述。你能提供任何信息吗?? @ChrisWard1000:我认为 OP 希望 我们 可以告诉 他们 为什么它不起作用。但是,如果 OP 告诉我们 如何 它不起作用,那将会很有帮助。 我说它不起作用,因为它显示:第 1-2 行:2293512 第 3-5 行:2293456 第 6-7 行:4287201 其他行:0 @Lightness Races in Orbit 你是绝对正确的。我在评论中付出的努力与 OP 对他的问题所做的一样多。 【参考方案1】:

我看到两个不同的变量,它们的名称完全相同,但类型不同,作用域也不同。

你觉得这有点令人困惑吗?

ifstream archivoLectura;

ofstream archivoLectura;


按照您的代码:

第 1 步:

ifstream archivoLectura;
archivoLectura.open("informeuso.txt");  // This might fail, and you check for archivoLectura.fail()

第 2 步:

archivoLectura>>var1;  // trying to read from the ifstream, which failed to open.
archivoLectura>>var2;  // The ofstream (which was opened successfully) has gone out of scope.
archivoLectura>>var3;
archivoLectura>>var4;

您正在尝试从我们知道无法打开的文件中读取。 这对我来说似乎是个大问题。

【讨论】:

您认为这是问题所在吗? (提示:不 - 应该是评论!) @Lightness:是的,我确实认为这是问题所在。 为什么?存在名称阴影。 他正在重新打开 ofstream archivoLectura 期望重新打开 ifstream。这比简单地为两个变量具有相同的名称更进一步,这在无效时会导致编译错误。当然,如果他遵循良好的理智,那么他不会使用相同的名称,那么就不会让他的误解导致这个问题。 :) 这就是我的观点。避免混淆(尽管有效)构造的程序员通常会避免更多的错误。编写令人困惑的结构的程序员会写更多的错误。 (例如。我认为我们同意)【参考方案2】:

检查一下....我认为这就是解决方案

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <iomanip>
#include <fstream>
#include <string>
using namespace std;

int main()


int varAux1,varAux2,varAux3,varAux4;
int a;
int var1,var2,var3,var4;


fstream archivoLectura;
archivoLectura.open("informeuso.txt" , ios::in);


    if (archivoLectura.fail())
    
            archivoLectura.open("informeuso.txt" , ios::out);
            archivoLectura<<0<<" ";
            archivoLectura<<0<<" ";
            archivoLectura<<0<<" ";
            archivoLectura<<0<<" ";      
            archivoLectura.close();
            archivoLectura.open("informeuso.txt" , ios::in);
    






    archivoLectura>>var1;
    archivoLectura>>var2;
    archivoLectura>>var3;
    archivoLectura>>var4;
    cout<<var1<<var2<<var3<<var4;

    varAux1 = var1;
    varAux2 = var2;
    varAux3 = var3;
    varAux4 = var4;


archivoLectura.close();


cout<<"hola"<<endl;
cout<<"programa prueba"<<endl;
cout<<"enter value from 0 to 9"<<endl;
cout<<"a: ";
cin >> a;



if (a>0 && a <3)


    var1 = varAux1 + 1;

else if(a>2 && a <6)


    var2 = varAux2 + 1;


else if (a>5 && a<8)

    var3 = varAux3 +1;


else

    var4 = varAux4 + 1;



fstream archivoEscritura;
archivoEscritura.open("informeuso.txt" , ios::out);

    archivoEscritura<<var1<<" ";
    archivoEscritura<<var2<<" ";
    archivoEscritura<<var3<<" ";
    archivoEscritura<<var4<<" ";

archivoEscritura.close();

system("pause");
return 0;

【讨论】:

以上是关于如何使用 C++ 在 .txt 文件中写入、读取和重写的主要内容,如果未能解决你的问题,请参考以下文章

c++文件怎么从文件中读出和写入字符串?

C++如何逐行读取txt文件,并将读取出来的数据进行运算导入到另一个文件中。

mfc c++ 从编辑控件更新文本文件

C++如何分别读取和查找txt文档中的内容

C++读写TXT (string类型存储读取或写入)

C++怎么读取或者写入到局域网共享的文件内容?