我附上了我的程序的完整源代码,可以打开.txt
文件。它不会在cout << length
之后执行。我试图通过使用数组将.txt
文件信息存储在内存中。
#include <iostream>
#include <string.h>
#include <fstream>
using namespace std;
char filename[128];
char file[10][250];
int count;
int length;
string line;
int main ()
{
int count = 0;
int length = 0;
cout << "Filename: ";
cin.clear();
cin.getline(filename, sizeof(filename));
string new_inputfile(filename);
ifstream inputfiles (new_inputfile.c_str());
if(!inputfiles.is_open())
{
cout << "File could not be opened. \n ";
}
else
{
for (int i=0; getline(inputfiles,line); i++)
{
length++;
}
cout << length;
// char file[length][250]; <- How can I create the array based on the length variable?
// CODE DOES NOT EXECUTE AFTER THIS.
while(!inputfiles.eof() && (count<10))
{
inputfiles.getline(file[count],250);
count++;
}
for(int i=0; i < count; i++)
{
cout << file[i] << endl;
}
}
inputfiles.close();
return 0;
}
此外,由于file[]
是char,例如file[1]
包含char Name=Mike
,如何在=
之前删除所有内容。我想要Mike
。我知道使用string
,我可以使用substr()
方法,但我不知道char
。
答案 0 :(得分:3)
这是计算文件中行数的非常浪费的方法。
for (int i=0; getline(inputfiles,line); i++) // i is also completely useless here
{
length++;
}
您正在阅读整个文件只是扔掉所有东西然后重新开始!完成此循环后,inputfiles.eof()
将为true
并且您永远不会同时输入下一个while
循环和最后一个for
循环(因为{{1} }})。执行会直接跳至i == count
,然后您从inputfiles.close()
返回。
我建议您在使用main
字符串时处理:
line
如果你想稍后存储这些行,那么只需保存它们:)最简单的方法是使用vector:
for ( ; getline(inputfiles, line); )
{
// do stuff with line and ditch the global char arrays
}
在那里,整个文件现在逐行保存在std::vector<std::string> all_them_lines;
while (getline(file, line) all_them_lines.emplace_back(line);
中。您可以像在all_them_lines
中一样访问它们。您也不需要事先了解行数 - 当您向其中添加内容时,向量会自动展开。
现在要解析一行并从中提取格式化的输入,请查看stringstream
class提供的内容。
答案 1 :(得分:-1)
你问:
// char file[length][250]; <- How can I create the array based on the length variable?
将file
声明为:
char (*file)[250] = NULL;
然后,
file = new char[length][250];
确保在功能结束前致电delete [] file
。
你说:
// CODE DOES NOT EXECUTE AFTER THIS.
你可以rewind the stream并再次开始阅读。
inputfiles.seekg(0);
count = 0;
while(!inputfiles.eof())
{
inputfiles.getline(file[count],250);
count++;
}