直到今天我才使用过字符串或字符串函数,而且我遇到了一个我不明白的问题。这个程序应该只接受一个命令行参数,加载文件并将其显示到内存中。但它会多次显示。我非常确定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 );
}
答案 0 :(得分:1)
这是因为您有两个显示文件内容的打印语句。
第一个印刷声明就是这个:
std::cout.write(buffer,len);
第二个是:
std::cout << f.substr(0,i)<<std::endl;