更新: 問題を解決できました。質問はクローズできます!(どうすればよいか:解決策を確認してください)
少し問題が発生しました。pthread_create、fork など (並列プログラミング) などの POSIX ベースの関数を使用する必要があるため、最近 Macbook Air を購入することにしました。MacOSを搭載した最初のラップトップです。
そこに Xcode をインストールし、新しい C++ プロジェクトを開始しました。次に、プログラムを作成し、実行しようとしました。エラーはなく、ビルドは成功しましたが、実行しようとすると、最も奇妙な場所で SIGABRT エラーが発生しました。なぜそうなったのかわからなかったので、WindowsデスクトップのEclipseプロジェクトにコードをコピーしたところ、問題なく動作しました。これで私を助けてもらえますか?問題は何ですか?何かをインストールするのを忘れたのでしょうか?
#include <iostream>
#include <unistd.h>
#include <fstream>
#include <vector>
#include <map>
#include <iterator>
#include <cstdlib>
int main(int argc, const char * argv[])
{
const char* sequenceFile=argv[1];
const char* patternFile=argv[2];
std::ifstream file;
file.open(sequenceFile,std::ifstream::in);
std::vector<std::string> k;
std::string line;
if(file.is_open()){
while(std::getline(file,line)){
k.push_back(line);
}
}
int lengseq=atoi(k.at(0).c_str()); //for example SIGABRT here
std::string sequence = k.at(1);
file.close();
file.open(patternFile,std::ifstream::in);
k.clear();
if(file.is_open()){
while(std::getline(file,line)){
k.push_back(line);
}
}
std::map<std::string,int> patterns;
for(unsigned i=1;i<k.size()-1;){
patterns[k.at(i+1)]=atoi(k.at(i).c_str());
i+=2;
}
//serial
bool seqCheck = false;
typedef std::vector<std::pair<std::string, int> > my_vector;
my_vector patternOccurences;
typedef std::map<std::string,int>::iterator it_type;
for(it_type iterator=patterns.begin();iterator!=patterns.end();iterator++){
for(int i = 1;i<lengseq;i++){
if(i+iterator->second-1<=lengseq){
for(int j=0;j<iterator->second;j++){
if(sequence.at(j+i-1)==iterator->first.at(j)){
seqCheck=true;
}
else{
seqCheck=false;
break;
}
}
if(seqCheck==true){
patternOccurences.push_back(std::make_pair(iterator->first,i));
}
}
}
}
for(unsigned i =0;i<patternOccurences.size();i++){
std::cout<<"Pattern: "<<patternOccurences.at(i).first<<" at index "<<patternOccurences.at(i).second-1<<std::endl;
}
return 0;
}
それは私が使用していたコードでした。コードが乱雑で申し訳ありません。そして、あなたが疑問に思っている場合は、実際にコマンドライン引数を設定したので、それは問題ではありません.
編集: ファイルを開くことができないファイルのようです。追加した:
else{
std::cerr<<"Couldn't open file!";
return 0;
}
if(file.is_open()) の後、そこにまっすぐジャンプします。ファイル名を設定します (コマンド ライン引数を project->scheme->edit スキームで設定し、引数として追加すると、プロジェクト ディレクトリにテキスト ファイルがあります。何が問題になるのでしょうか?
解決策: 問題は、テキストファイルへのパス全体を入力しなければならないことでした。プロジェクトディレクトリにテキストファイルを配置するのに慣れていたので、WindowsデスクトップでEclipseを使用しているときにパスを入力する必要がありませんでした(おそらくワークスペースのため)。助けてくれたすべての人に感謝します。Xcode で作業するときは、パスを入力することを忘れないでください。;)
よろしくお願いします。お役に立てば幸いです。カズーイエ