从文本文件(textparser)C ++中读取行和列的逻辑

时间:2014-09-08 01:22:30

标签: c++

我真的遇到了这个问题,我要从文本文件中读取行和列。我们正在使用我们教授给我们的文本文件。我有运行的功能,所以当用户输入" 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;
} 

1 个答案:

答案 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;语句。人们会建议不要使用这样的命名空间,但它可以很方便(这也是避免它的一个很好的理由,等等!)