0

当我执行 cout seqA 时,例如如果 dummyLine=ACACACTA seqA 有问题。我将 temp 用于动态数组,因为在此代码之后我编写 seqA[lenA] 编译器说必须确定数组的维度。

char *seqA=NULL;
char *temp=NULL;
int lenA = 0;

fileA.open("d:\\str1.fa");
if(fileA == NULL) {
    perror ("Error opening 'str1.fa'\n");
    exit(EXIT_FAILURE);
}

string dummyLine;
getline(fileA, dummyLine);

while(getline(fileA, dummyLine)) {
    lenA=lenA+(dummyLine.length());
    temp=(char*)realloc(seqA,lenA*sizeof(char));
    if (temp!=NULL) {
        seqA=temp;
        for (int i=0; i<(dummyLine.length()); i++)
        {
            seqA[lenA-dummyLine.length()+i]=dummyLine[i];
        }
    }
    else {
        free (seqA);
        puts ("Error (re)allocating memory");
        exit (1);
    }
}

cout<<"Length seqA is: "<<lenA<<endl;
cout<<seqA<<endl;
fileA.close();

输出图片: 在此处输入图像描述

4

2 回答 2

3

我对这段代码的阅读是您试图从文件中读取所有行,并将它们连接到一个缓冲区中。为此,您应该只使用另一个字符串对象。就像是:-

string dummyLine;
string fileContents;
getline(fileA, dummyLine);

while(getline(fileA, dummyLine)) {
    fileContents += dummyLine;
}

这将使 std::string 完成所有艰苦的工作,这样您就不必这样做了。也短了很多。

于 2013-05-05T06:57:36.907 回答
2

问题是您没有在seqA.

realloc会给你一个指向一些未初始化内存的指针。然后你复制每个字符,dummyLine但之后只有随机内存。确保在末尾添加一个空字符以seqA使其成为有效的 C 字符串。

考虑到这一点,您需要在分配中添加一个额外的字符,其中 null char 可以坐temp=(char*)realloc(seqA,(lenA+1)*sizeof(char));

seqA[lenA-1] = '\0';
out<<seqA<<endl;
于 2013-05-05T06:52:05.830 回答