从文本文件中读取行时出现字符串分段错误
Posted
技术标签:
【中文标题】从文本文件中读取行时出现字符串分段错误【英文标题】:string segmentation fault when reading lines from text file 【发布时间】:2014-12-08 20:58:28 【问题描述】:我在尝试读取文本文件的行并将它们放入程序中的相应字符串时遇到此段错误。
if(infile.is_open())
//calculating the number of lines
while(getline(infile, line))
numberoflines++;
//Find start of the file and start reading
infile.clear();
infile.seekg(0, ios::beg);
if(!infile.eof())
//Allocate an array of strings, each string contains a line from the input file
string STRING[numberoflines];
int i = 0;
while(getline(infile, STRING[i]))
cout<<STRING[i]<<endl;
i++;
infile.close();
程序实际上打印出每一行,但在提供更大的文本文件时以段错误终止。
【问题讨论】:
什么是STRING
?为什么要调用变量STRING
?
什么是更大?你的程序中的行数是否大于numberoflines
?
我闻到了***的味道,使用std::vector<std::string> lines(numberoflines);
numberoflines 是否初始化为 0 ?在哪里?
C++ 没有动态大小的内置数组。如果您的代码编译,它使用扩展。你最好使用std::vector<std::string>
并使用push_back(line)
添加字符串。
【参考方案1】:
您不应该读取文件两次(一次用于行数,一次用于行本身)。正如其他人所建议的那样,使用 std::vector 非常适合。这是一个例子:
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
#include <iterator>
int main( int argc, char ** argv )
if( argc != 2 )
return 1;
std::vector< std::string > lines;
std::ifstream infile( argv[1] );
if( infile.is_open() )
std::string buffer;
while( std::getline( infile, buffer ).good() )
lines.push_back( buffer );
inflie.close();
size_t numberoflines = lines.size();
std::ostream_iterator< std::string > out( std::cout, "\n" );
std::copy( lines.begin(), lines.end(), out );
【讨论】:
非常感谢您的回答,我不是专业程序员,还没有学过vector。只是想知道如果您实际实现了如何访问每个单独的字符串。再次感谢! 当然。像数组一样,您可以使用类重载的下标运算符 [ 访问每个元素。所以你会为第一个做lines[0],为第二个做lines[1],等等。lines.size() 返回向量的长度(0 表示空)。您可以通过以下方式进行迭代: for( size_t index = 0; index ::iterator iter(lines.begin() ); iter != lines.end(); ++iter ) *iter;以上是关于从文本文件中读取行时出现字符串分段错误的主要内容,如果未能解决你的问题,请参考以下文章
php file_get_contents函数分段读取大记事本或其它文本文件