我想逐行读取一个文本文件并在数组中添加每一行,我尝试类似的东西,但是我的数组出了什么问题,是什么?
QFile inputFile("C:\\pepoles.txt");
if (inputFile.open(QIODevice::ReadOnly))
{
QTextStream in(&inputFile);
QString pepoles[1000];
while ( !in.atEnd() )
{
QString line = in.readLine();
pepoles[] = line;
}
ui->lineEdit->setText(pepoles[0]);
}
else{
QMessageBox::critical(this, "Ouups",
"Le fichier est introuvable ou vide...");
}
inputFile.close();
}
谢谢!
答案 0 :(得分:3)
跟踪您已阅读的行数,并使用它索引pepoles。另外,请确保不要超过阵列容量。
int lineNum = 0;
QFile inputFile("C:\\pepoles.txt");
if (inputFile.open(QIODevice::ReadOnly))
{
QTextStream in(&inputFile);
QString pepoles[1000];
while ( !in.atEnd() && lineNum < 1000)
{
QString line = in.readLine();
pepoles[lineNum++] = line;
}
答案 1 :(得分:1)
您应该使用QStringList
代替QString [1000];
。
然后你可以简单地用
添加一行peoples << line;
现在你的语法不正确。您正在尝试将line
分配给数组,或者是什么?您只能将line
指定给数组的指定元素,例如
peoples[i] = line;
但你最好先使用第一种方法。
答案 2 :(得分:1)
您需要指定要复制字符串的位置。例如:
pepoles[0] = line;
将字符串复制到数组的第一个元素。显然你需要一个变量来迭代数组,这样你就可以在每个循环中将新字符串复制到数组中的下一个位置。
您应该使用QStringList
而不是数组来使事情变得更容易和更安全,这样您就不会意外地写出数组的末尾。例如,您可以像这样定义pepoles
;
QStringList pepoles;
然后,每次要在末尾添加新字符串时,都会执行以下操作:
pepoles << line;
以下是QStringList
关于如何使用它的文档:http://doc.qt.digia.com/qt/qstringlist.html#details
您也可以使用std::vector<QString>
代替:
std::vector<QString> pepoles;
在这种情况下,您在末尾插入字符串:
pepoles.push_back(line);
在此处阅读std::vector
:http://www.cplusplus.com/reference/stl/vector
std::vector
不属于Qt。它由标准C ++库提供。
答案 3 :(得分:1)
此外,这仅显示第一行:
ui->lineEdit->setText(pepoles[0]);
你可能想要这样的东西(如果pepoles是QStringList)
ui->lineEdit->setText(pepoles.join());
join()方法将生成一个QString,用于连接qstringlist中的所有项目
编辑:并且可能使用除LineEdit以外的其他内容;)
答案 4 :(得分:0)
这个问题实际上取决于很多事情。您从文本文件中抽象出来的信息的计划是什么。您是要将其输出到另一个文本文件,将其显示在具有文本对象功能的窗口小部件中(即QTextEdit,QLineEdit等...),将其发送到数据库,将其用于某种类型(即删除重复的条目或分隔/删除行间距)?问题的文本文件是否行换行?每行中有多少个字符,因此有多少位。
我说这个,原因有很多。众所周知,Qt使用Meta-Object-Compiler和广泛的宏来丰富C ++语言。回到该宏的C ++编程基础知识,在编译器实际看到它之前重新排列程序文本。我发现在Qt中,这比使用文本对象和文件I / O发送到文本对象的任何东西都要真实。这又取决于您如何设计应用程序。最好遵循Bjarne的建议和决定你想要哪些类,为每个类提供一整套操作,通过使用继承来明确共性。如果没有这种共性,数据抽象就足够了。&#34;。
现在我已经说过你可能有运行时错误,或者应用程序在编译期间或编译后意外崩溃/完成。这意味着您必须将程序/应用程序重写为您的数据流计数。
如果您想要文本文件中的数据,那么您可以搜索/排序文本,就像二进制搜索算法一样,使用一个这样的数组进行比较是行不通的。如果要显示文本对象中的所有名称并搜索那些最好创建QScrollArea和QTextEdit,并将QTextEdit添加到QScrollArea,如下所示:
scrollArea = new QScrollArea(this);
textEdit = new QTextEdit("",this);
textEdit -> setGeometry(QRect(QPoint(150, 50), QSize(400,20000)));
scrollArea -> setGeometry(QRect(QPoint(150, 50), QSize(400,300)));
scrollArea -> setWidget(textEdit);
*注意:您可以将短信的长度设置为超出窗口大小! 12字体至少有一千行。是20000,南北4点包含线边缘。
如果在父对象类中创建了scrollarea和textedit,则读取该文件,使用readAll而不是readLine,并将其显示在textEdit中。一千行的线编辑很大!!您不必迭代,在这种情况下,您使用QFile :: ReadOnly描述的内容就足够了。如果您执行父对象类(即主窗口)中描述的内容,则行编辑会创建一个读取文件的void函数,并按如下所示显示:
textEdit->setPlainText(line);
然后只需调用mainWindow函数底部的函数。如上所述,创建一个连接字符串的数组毫无意义。当你使用我描述的三到五行函数时,你可以更容易地编辑它们。
如果此应用程序不适合您使用,并且您可能想要公开:这可能需要通过函数和数据抽象计算以及从数组填充后的文本对象输入。在这种情况下,创建容器QStringList并在文件关闭后使用如下所示的qFill算法。
QList<QString> Lstring(lineNumbers); //line numbers is the size of strings per line
qFill(Lstring, peoples.size());
foreach(QString item, Lstring){
textObjectOfChoice -> setText();
}
我个人更喜欢使用QStringList,在MainWindow的类设置为false(关闭),并在int main {}中创建一个布尔函数,一旦应用程序开始执行,当然已创建MainWindow或dialoge对象,在该对象上调用点分隔符,并通过参数传递true,将文件加载一次。然后在调用w.show()之后;并且在递归返回app.exec()之前,调用相同的点分隔符函数,然后将值传递给false。注意:启动屏幕有助于此。我本人只有高达五十万字的250万字符而没有闪屏,它可能会更长,这取决于你个人在应用程序中编写的课程数量。下面是一个可以调用的函数示例:
void WordGame::fileStart(bool load){
start = load;
if (start){
QFile myfile(":/WordGame/WordGame/TheHundredGrand.txt");
if(myfile.open(QIODevice::ReadOnly | QIODevice::Text))
{
QString line;
QTextStream stream(&myfile);
int index = 0;
int length = 0;
do
{
line = stream.readLine();
arryOne[index] = line;
listOne << arryOne[index];
index++;
length++;
}while(index<109582);
stream.flush();
myfile.close();
}
}
}
主要是调用WordGame主窗口类,如下所示: bool load = true; WordGame w; w.fileStart(负载);
w.show();
w.fileStart(!load);
return app.exec();
这当然是你在qrc源文件中有你所指的单词列表。 如果您在调用应用程序的第一个实例后不创建要退出的算法的文件加载部分,则列表将继续扩展重复(请记住,所有具有标准输入/输出的c / c ++应用程序本身都是重复的,因此返回app.exec)。将数据抽象到第一个列表创建功能之外的另一个列表(意味着将解析原始列表),以便可以将其与原始列表进行比较,例如,已经回答,以前回答,以前搜索过等等,并不是基于文本对象数量的最明智的移动。它只是创建另一个用户输入列表,然后迭代初始列表与用户输入列表。我会用这样的东西:
QStringList::iterator i3 = qFind(userInputList.begin(), userInputList.end(), word);
QStringList::iterator i2 = qFind(listOne.begin(), listOne.end(), word);
在上面的迭代器中,我发现用户条目是否与另一个初始数据集匹配 搜索用户以前的输入。
注意: C ++或Java中的函数和/或方法应该是30行或更少的数据(非空行)。要重复地从具有文本对象功能(即lineEdit)的小部件中抽象和输入数据,并对它们执行计算,如果按照描述频繁打开文件,可能会导致以后出现问题。在将file.closed()操作完成到另一个函数之后,它看起来也应该是一个连接语句。或者使用布尔函数done = true;坦率地说,开发Qt / Cpp(或任何语言)的大型健壮软件的最佳方式是使用二进制(0或1)真或假,函数/方法完成。根据您的使用情况,创建qrc文件并将文本文件添加为文件也可能会很有用。创建一次打开和关闭以填充数据容器将是主要事件循环之外的方法。如果使用Qstringlist,则可以连续填充列表,直到执行内存转储,然后导致应用程序失败。为了避免这种情况和额外的列表重置&#39;函数将按顺序排列,例如反向迭代与&#34;&#34;对于列表的每个索引位置为null。如果用户点击输入按钮或其他东西,或者你正在开发什么,它会自动调用包含TextStream对象的函数吗?
P.S。如果你真的想让它变得正义,你就可以像8位风格一样真正的老派,*如果你永远知道你的文本文件是什么,并且是不可改变的;并创建(它是什么?)int array [97],这是所有的alplanumeric加上Capitals加上特殊字符/ puncuation等于数组的一个索引位置。例如,一个整数等于一个字符,例如[0] = a,[1] = b,[26] = A,并创建一个字母出现程序来计算/绘制每一行的每个字符的位置,然后一旦获得该特定单词文件的统计数据或文本文件,通过一个函数迭代int数组,该函数将整数与其相关键输入匹配(通过临时变量),然后进入QStringList,然后反向迭代到将显示给文本对象的文本对象。您的应用程序的用户。