我真的遇到了这个问题,我要从文本文件中读取行和列。我们正在使用我们教授给我们的文本文件。我有运行的功能,所以当用户输入" numrows(file)"打印出该文件中的行数。
但是,每次我输入文本文件时,它都会给我19个。第一个文本文件只有4行,另一个有7行。我知道我的逻辑是错误的,但我不知道如何修复它。
这是我对numrows函数所拥有的:
int numrows(string line) {
ifstream ifs;
int i;
int row = 0;
int array [10] = {0};
while (ifs.good()) {
while (getline(ifs, line)) {
istringstream stream(line);
row = 0;
while(stream >>i) {
array[row] = i;
row++;
}
}
}
}
以及这里的数字:
int numcols(string line) {
int col = 0;
int i;
int arrayA[10] = {0};
ifstream ifs;
while (ifs.good()) {
istringstream streamA(line);
col = 0;
while (streamA >>i){
arrayA[col] = i;
col++;
}
}
}
编辑:@chris是的,我也不确定要返回什么值。这是我的主要内容:
int main() {
string fname, line;
ifstream ifs;
cout << "---- Enter a file name : ";
while (getline(cin, fname)) { // Ctrl-Z/D to quit!
// tries to open the file whose name is in string fname
ifs.open(fname.c_str());
if(fname.substr(0,8)=="numrows ") {
line.clear();
for (int i = 8; i<fname.length(); i++) {
line = line+fname[i];
}
cout << numrows (line) << endl;
ifs.close();
}
}
return 0;
}
答案 0 :(得分:1)
通过将文本文件打开为ifstream
,然后使用std::get
处理您的输入,可以更轻松地解决此问题。
您可以尝试与&#39; \ n&#39;进行比较。作为行尾字符,并实现一对计数器,一行用于一行,另一行用于行。
如果您有可变长度列,您可能希望使用myVector.push_back(numColumns)
或类似内容将(numColumns在一行中)的值存储在std::vector<int>
中。
这两个链接都指向cplusplus.com/reference部分,它可以提供有关C ++和STL的大量信息。
编辑可能的工作流程概述
你想要一个程序,它将采用一个文件名和一个&#39;操作&#39;,在这种情况下&#34; numrows&#34;或&#34; numcols&#34;。因此,您的第一步是找出文件名和操作。
您当前对此的实施(在您的问题中,在编辑后)无法正常工作。但是,使用cin
应该没问题。在打开文件之前,先将其放在main()
中。
像您一样使用substr,或者搜索空格字符。假设此后的输入是您的文件名,第一部分中的输入是您的操作。存储这些值。
在此之后,尝试打开您的文件。如果文件成功打开,请继续。如果它不能打开,则向用户投诉输入错误,然后返回到开头,再次询问。
成功打开文件后,请检查要运行的计算类型。计算多行非常简单 - 您可以一次查看一个字符的文件,并计算等于&#39; \ n&#39;(行结束字符)的数字。有些文件可能会使用回车符,换行符等 - 这些文件有不同的字符,但它们都是a)不太可能是你拥有的东西而且b)容易查找!
许多列更复杂,因为您的行可能并非都具有相同的列数。如果您的输入为1 25 21 abs 3k
,您希望该值为5吗?如果是这样,您可以计算该行上的空格字符数并添加一个。相反,如果您希望值为14(每个字符和每个空格),则只需根据您在到达&#39; \ n&#39;之前调用get()
的次数来计算字符数。字符。使用如下所述的矢量来存储这些值可能是有意义的。
计算了这两个值(或值和值集)后,您可以根据&#39;操作的值输出&#39;变量。例如,
if (storedOperationName == "numcols") {
cout<< "The number of values in each column is " << numColsVal << endl;
}
如果您有列值向量,则可以使用
输出所有列值for (int pos = 0; pos < numColsVal.size(); pos++) {
cout<< numColsVal[pos] << " ";
}
完成所有这些后,您可以从main()
0
返回一个值,或者您可以结束该程序(C ++现在认为从main返回的值不是0的返回值),或者你可以要求另一个文件名,并重复,直到使用其他方法来结束程序。
更多详情
不带参数的 std::get()
将返回ifstream
的下一个字符,使用示例代码格式
std::ifstream myFileStream;
myFileStream.open("myFileName.txt");
nextCharacter = myFileStream.get(); // You should, before this, implement a loop.
// A possible loop condition might include something like `while myFileStream.good()`
// See the linked page on std::get()
if (nextCharacter == '\n')
{ // You have a line break here }
你可以使用这种类型的结构,以及前面描述的一对计数器来计算一行上的字符数,以及EOF之前的行数(文件末尾)。
如果要在一行中存储字符数,对于每一行,您可以使用
std::vector<int> charPerLine;
int numberOfCharactersOnThisLine = 0;
while (...)
{
numberOfCharactersOnThisLine = 0
// Other parts of the loop here, including a numberOfCharactersOnThisLine++; statement
if (endOfLineCondition)
{
charPerLine.push_back(numberOfCharactersOnThisLine); // This stores the value in the vector
}
}
您之前应该#include
<vector>
和特定的std::
,或者使用靠近顶部的using namespace std;
语句。人们会建议不要使用这样的命名空间,但它可以很方便(这也是避免它的一个很好的理由,等等!)