使用fstream从txt文件中获取行

时间:2013-11-08 19:05:02

标签: c++ fstream getline

int main(int argc, const char * argv[])
{
    ifstream input;
    input.open("test.txt");
    string arrAtoms[700];
    string temp;
    int i = 0;
    while(getline(input, temp)){
        if(startsWithAtom(temp)) {
            arrAtoms[i] = temp;
            i++;
        }
    }
    return 0;                
}

bool startsWithAtom(string test) {
    string atom = "ATOM";
    if(test.find(atom) == 0) {
        return true;
    }
    return false;
}

所以这是我的代码来读取一行并将其存储在arrAtoms []中,如果它以“ATOM”开头。 出于某种原因,我不断收到错误Thread1:EXC_BAD_ACCESS(code = EXC_1386_GPFLT) 我不知道为什么。请帮忙!

2 个答案:

答案 0 :(得分:1)

我的机器上的代码运行得很好。也许问题是该文件的ATOM条目多于700?而你的字符串数组只能包含700个。如果你不知道会有多少条目,请尝试使用vector

这是我测试代码的文件:

  

soadiaodiaodsa
  sdaiod sadoiasoda
  ATOM alodaskd
  ATOM alosad
  ATOM lol
  saodai aosdisoad daiosiadsa
  原子原子原子
  ATOM LOL测试
  lololololol

我也尝试输出数组中的前15个条目,它工作正常,只包含以ATOM开头的行:

for(unsigned int i=0;i<15;i++)
  cout << arrAtoms[i] << endl;

答案 1 :(得分:0)

您正在使用长度为700的array。如果您的文件有超过700行以“ATOM”开头,则会发生内存分配错误。更好的方法是使用vector,这样您就不必担心文件的大小。

#include <vector>
int main(int argc, const char * argv[])
{
    ifstream input;
    input.open("test.txt");
    std::vector <string> arrAtoms;
    string temp;
    while(getline(input, temp)){
    if(startsWithAtom(temp)) {
        arrAtoms.push_back(temp);
      }
    }
    return 0;                
}