2011-06-25 78 views
4

免责声明:这个问题直接关系到我的编程作业。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; 
} 

我现在遇到的主要问题是,我不知道如何在连基层一个文件中读取数据,更不用说解析文件到相关信息(程序的目的是读取,写入和操作以分号分隔的列表中的信息)。

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

+1

背后的“逻辑”要求您以艰难的方式做一些事情,以便您有机会调查困难方式的工作方式。然而,我可能会认为在C++中使用'char'数组是没有根据的折磨。保存汇编语言类的直接内存操作。 –

+0

您可以做的一件事是将** i ** fstream和** o ** fstream decalration更改为单个** f **流 – Tim

+0

您可以通过'while'循环中的行逐行读取文件,方法是使用' readline'和一个临时字符串。 – Blender

回答

3

您不会同时打开一个文件进行读取和写入。那么,不要用两个不同的对象来互相不了解对方。您可以使用std :: fstream(可以同时读取和写入),或者先读取关闭文件,处理数据然后写入。

另外:

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

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

这是缓冲区溢出的来源。

+5

虽然我完全同意你的分析,但我必须说,使用char *数组的全部意义在于教会它如何在低层完成,以及为什么使用更现代的编码更好。但要理解为什么有些不好,你必须经历使用它的艰辛。 – Genzume

+0

对于低级编码,使用C stdio会更好。 – zvrba

+1

@zvrba:我是否相信你,用户询问_iostreams_。由于这是作业,老师对他们能做的事情进行限制。所以你所提出的建议与其说是“回答”,不如说是“为你最喜欢的IO模型改变方向”。 –

1

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

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

最后,文件包含:

changing file text cause I can 

,别无其他。

因此,要阅读该文件,您不能像打开文件那样打开它。如果要将文件文本更改为字符串,则可以简单地执行两个单独的操作。打开inData,阅读并关闭它。 现在打开outData,写我们的字符串,并关闭它。另一方面,如果您想要将字符串附加到现有文件的末尾,则应该打开一个用于读取和写入的流。读直到文件结束,然后文件指针仍然在最后,写下你的字符串。

这就是基本的想法。更多的,我会做你的功课你。 :)