模式匹配循环重复超过所需

时间:2016-03-20 18:24:36

标签: c++ string for-loop substring

直到今天我才使用过字符串或字符串函数,而且我遇到了一个我不明白的问题。这个程序应该只接受一个命令行参数,加载文件并将其显示到内存中。但它会多次显示。我非常确定for循环是问题所在,但它与我正在使用的编程参考中使用的技术相同。

#include <iostream>
#include <fstream>
#include <vector>
#include <string>

char* getFile( char* fileName ){
    std::fstream inFile( fileName );
    if( !inFile ) std::cout << "Could not open " << fileName << ".\n";
    else{
        inFile.seekg(0,inFile.end);
        int len = inFile.tellg();
        inFile.seekg(0,inFile.beg);
        char* buffer = new char[len];
        inFile.read( buffer, len);
        inFile.close();
        std::cout.write(buffer,len);
        return buffer;
        }

    }
int main(int argc, char** argv){
    if(argc != 2) std::cout << "Parameter required\n";
    else{
        std::string f = getFile( argv[1] );
        for( size_t i = f.find( 0x0A, 0 ); i != std::string::npos ; i = f.find( 0x0A, i) ){
            std::cout << f.substr(0,i)<<std::endl;
            i++;
            }
    }
}

我至少看到了我的代码中的一个问题。我重新编写循环作为while循环,因为它更容易关注并且更多地关注我开始和停止的位置。但它似乎仍然打印两次。

int main(int argc, char** argv){
    if(argc != 2) std::cout << "Parameter required\n";
    else{
        std::string f = getFile( argv[1] );
        size_t start = 0;
        size_t end = 1;
        while( end != std::string::npos ){
            end = f.find( 0x0A, start );
            std::cout << f.substr(start,end)<<std::endl;
            start = ( end + 1 );
            }

1 个答案:

答案 0 :(得分:1)

这是因为您有两个显示文件内容的打印语句。

第一个印刷声明就是这个:

std::cout.write(buffer,len);

第二个是:

std::cout << f.substr(0,i)<<std::endl;