在C ++中读取文本文件的正确方法是什么?

时间:2011-12-10 02:49:36

标签: c++

我需要在C ++中创建一个必须逐行读取和写入特定格式文本文件的程序,但问题是在我的PC中我在Windows中工作,而在大学里他们有Linux而我遇到了问题因为这些操作系统中的行结尾不同。

我是C ++的新手,不知道我是否可以让我的程序能够读取文件,无论它们是用Linux还是Windows编写的。谁能给我一些提示?谢谢!

输入如下:

James White 34 45.5 10 black
Miguel Chavez 29 48.7 9 red
David McGuire 31 45.8 10 blue

每一行都是6个变量结构的记录。

6 个答案:

答案 0 :(得分:2)

在没有最后一个(即分隔符)参数的情况下使用std::getline重载应该自动处理行尾转换:

std::ifstream in("TheFile.txt");
std::string line;

while (std::getline(in, line)) {
    // Do something with 'line'.
}

答案 1 :(得分:1)

这是一种删除额外“\ r”字符串的简单方法:

std::ifstream in("TheFile.txt");
std::string line;

std::getline(input, line));
if (line[line.size() - 1] == '\r')
    line.resize(line.size() - 1);

答案 2 :(得分:0)

由于结果将是CR LF,我会添加如下内容以消耗附加内容(如果存在)。所以,一旦你读完你就记录了这个,然后再尝试阅读下一个。

 std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

答案 3 :(得分:0)

如果您已经可以阅读这些文件,只需检查所有换行符,例如"\n""\r"。我很确定linux使用"\r\n"作为换行符。

您可以阅读此页面:http://en.wikipedia.org/wiki/Newline

以下是所有ascii代码的列表,包括换行符:

http://www.asciitable.com/

编辑:Linux使用"\n",Windows使用"\r\n",Mac使用"\r"。感谢Seth Carnegie

答案 4 :(得分:0)

如果您知道要为每条记录阅读的值的数量,您只需使用“&gt;&gt;”方法。例如:

fstream f("input.txt" std::ios::in);
string tempStr;
double tempVal;

for (number of records) {
    // read the first name
    f >> tempStr;
    // read the last name
    f >> tempStr;
    // read the number
    f >> tempVal;
    // and so on.
}

应该不够吗?

答案 5 :(得分:0)

您好,我会分阶段给您答案。请深入了解代码。

第1阶段:设计我们的计划: 我们基于要求的计划应该......:

  • ...包含保存数据的数据类型的定义。即我们的 6个变量的结构。
  • ...提供用户交互,即用户应该能够 提供程序,文件名及其位置。
  • ...能够 打开所选文件。
  • ...能够读取文件数据和 将它们写入/保存到我们的结构中。
  • ...能够关闭文件 读取数据后。
  • ...能够打印出已保存的数据。

通常您应该将代码拆分为代表上述内容的函数。

阶段2:创建所选结构的数组以保存数据

...
#define MAX 10
...
strPersonData sTextData[MAX];
...

第3阶段:允许用户同时提供文件位置及其名称:

.......
string sFileName;
cout << "Enter a file name: ";
getline(cin,sFileName);
ifstream inFile(sFileName.c_str(),ios::in);
.....

- &gt;第3阶段的注1。用户提供的接受格式应为:

  

c:\\SomeFolder\\someTextFile.txt

我们使用两个\反斜杠而不是一个\,因为我们希望它被视为文字反斜杠。

- &gt;第3阶段的注2。我们使用ifstream即输入文件流,因为我们想从文件中读取数据。这个 期望文件名为c-type字符串而不是c ++字符串。出于这个原因,我们使用:

..sFileName.c_str()..

第4阶段:阅读所选文件的所有数据:

...
    while (!inFile.eof())   { //we loop while there is still data in the file to read
...
    }
...

所以最后代码如下:

#include <iostream>
#include <fstream>
#include <cstring>

#define MAX 10

using namespace std;

int main()
{
    string sFileName;

    struct strPersonData    {
        char c1stName[25];
        char c2ndName[30];
        int iAge;
        double dSomeData1;      //i had no idea what the next 2 numbers represent in your code :D
        int iSomeDate2;
        char cColor[20];        //i dont remember the lenghts of the different colors.. :D
        };

    strPersonData sTextData[MAX];

    cout << "Enter a file name: ";
    getline(cin,sFileName);
    ifstream inFile(sFileName.c_str(),ios::in);

    int i=0;
    while (!inFile.eof())   { //loop while there is still data in the file

       inFile >>sTextData[i].c1stName>>sTextData[i].c2ndName>>sTextData[i].iAge
            >>sTextData[i].dSomeData1>>sTextData[i].iSomeDate2>>sTextData[i].cColor;

        ++i;
    }
    inFile.close();

    cout << "Reading the file finished. See it yourself: \n"<< endl;
    for (int j=0;j<i;j++) {
        cout<<sTextData[j].c1stName<<"\t"<<sTextData[j].c2ndName
            <<"\t"<<sTextData[j].iAge<<"\t"<<sTextData[j].dSomeData1
            <<"\t"<<sTextData[j].iSomeDate2<<"\t"<<sTextData[j].cColor<<endl;
    }
    return 0;
}

我现在要给你一些练习:D:D

1)在最后一个循环中:

for (int j=0;j<i;j++) {
    cout<<sTextData[j].c1stName<<"\t"<<sTextData[j].c2ndName
        <<"\t"<<sTextData[j].iAge<<"\t"<<sTextData[j].dSomeData1
        <<"\t"<<sTextData[j].iSomeDate2<<"\t"<<sTextData[j].cColor<<endl;}

为什么我使用变量i代替MAX?

2)你可以改变基于第1阶段的程序,例如:

int main(){

function1()
function2()
...
functionX()

...return 0;
}

我希望我能帮助......