免责声明:这个问题与我的编程作业直接相关。
我的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数组。我不明白这背后的逻辑,并希望有人可以详细说明为什么(或者可能为什么提出反驳论据)字符串是坏的。
答案 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
,写下我们的字符串,然后关闭它。
另一方面,如果您想要将字符串附加到现有文件的末尾,则应打开单个流进行读写。读到文件末尾,然后文件指针仍在结尾处,写下你的字符串。
这是基本的想法。还有更多,我会做 你的作业。 :)