C ++从文件中读取数据

时间:2011-06-25 03:23:00

标签: c++

免责声明:这个问题与我的编程作业直接相关。

我的C ++分配包括打开.txt文件,对其执行一系列操作,然后保存.txt文件。问题是,我很难掌握阅读和编写文件的基本概念。

我的代码:

#include <iostream>
#include <fstream>
using namespace std;

int main () {
    ifstream inData;
    ofstream outData;

    // is it necessary to open datalist.txt for both the in and out streams?
    inData.open ("datalist.txt");
    outData.open("datalist.txt");

    if (inData.is_open()) { 
        cout << "yay, i opened it\n"; // this outputs as expected

        char fileData[100]; // have to use char arrays as per instructor. no strings
        inData >> fileData; // store text from datalist.txt in fileData char array
        cout << fileData; // nothing happens here... why?

        outData << "changing file text cause I can"; // this works just fine.
    }
    else {
        cout << "boo, i couldn't open it";
    }

    inData.close();
    outData.close();

    return 0;
}

我遇到的主要问题是我不理解如何在基本级别读取文件中的数据,更不用说将文件解析为相关信息(程序的目的是读取,写入,并以分号分隔列表操纵信息。)

除了这个问题,我对其他两件事情也有些困惑。首先,是否有必要为in和out流打开datalist.txt,由于某种原因,我必须两次打开同一个文件感觉很奇怪。其次,我的教师不希望我们使用字符串类,而是使用char数组。我不明白这背后的逻辑,并希望有人可以详细说明为什么(或者可能为什么提出反驳论据)字符串是坏的。

2 个答案:

答案 0 :(得分:3)

您不会同时打开文件进行读写。好吧,不是两个不同的对象,无论如何都不知道彼此。您可以使用std :: fstream(可以同时读取和写入),也可以先读取,关闭文件,处理数据,然后写入。

此外:

  

//必须按照教师使用char数组。没有字符串

我想你可能想要一个更好的教练。使用裸露的基于堆栈的 char*数组并不是任何值得他们认可的C ++老师认可的。

这是缓冲区溢出的来源。

答案 1 :(得分:1)

通过两个不同的文件对象打开相同的文件进行读写通常是个坏主意。在您的情况下,它也导致(部分)您的问题。默认情况下,打开ofstream会截断它。所以当你从inData读到时,你什么也得不到。这就是为什么没有发生的原因:

cout << fileData; // nothing happens here... why?

最后,您的文件包含:

changing file text cause I can

没有别的。

因此,要阅读该文件,您不能打开它进行写作。如果要将文件文本更改为仅字符串,则只需执行两个单独的操作即可。打开inData,阅读并关闭它。 现在打开outData,写下我们的字符串,然后关闭它。

另一方面,如果您想要将字符串附加到现有文件的末尾,则应打开单个流进行读写。读到文件末尾,然后文件指针仍在结尾处,写下你的字符串。

这是基本的想法。还有更多,我会做 你的作业。 :)