+ catch(exception& e) {
+ cout << "Standard Error: " << e.what() << " has occurred in the mothur.h function appendFiles. Please contact Pat Schloss at mothur.bugs@gmail.com." << "\n";
+ exit(1);
+ }
+}
+
+/**************************************************************************************************/
+inline string sortFile(string distFile, string outputDir){
+ try {
+
+ //if (outputDir == "") { outputDir += hasPath(distFile); }
+ string outfile = getRootName(distFile) + "sorted.dist";
+
+
+ //if you can, use the unix sort since its been optimized for years
+ #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux)
+ string command = "sort -n -k +3 " + distFile + " -o " + outfile;
+ system(command.c_str());
+ #else //you are stuck with my best attempt...
+ //windows sort does not have a way to specify a column, only a character in the line
+ //since we cannot assume that the distance will always be at the the same character location on each line
+ //due to variable sequence name lengths, I chose to force the distance into first position, then sort and then put it back.
+
+ //read in file line by file and put distance first
+ string tempDistFile = distFile + ".temp";
+ ifstream input;
+ ofstream output;
+ openInputFile(distFile, input);
+ openOutputFile(tempDistFile, output);
+
+ string firstName, secondName;
+ float dist;
+ while (input) {
+ input >> firstName >> secondName >> dist;
+ output << dist << '\t' << firstName << '\t' << secondName << endl;
+ gobble(input);
+ }
+ input.close();
+ output.close();
+
+
+ //sort using windows sort
+ string tempOutfile = outfile + ".temp";
+ string command = "sort " + tempDistFile + " /O " + tempOutfile;
+ system(command.c_str());
+
+ //read in sorted file and put distance at end again
+ ifstream input2;
+ openInputFile(tempOutfile, input2);
+ openOutputFile(outfile, output);
+
+ while (input2) {
+ input2 >> dist >> firstName >> secondName;
+ output << firstName << '\t' << secondName << '\t' << dist << endl;
+ gobble(input2);
+ }
+ input2.close();
+ output.close();
+
+ //remove temp files
+ remove(tempDistFile.c_str());
+ remove(tempOutfile.c_str());
+ #endif
+
+ return outfile;
+ }
+ catch(exception& e) {
+ cout << "Standard Error: " << e.what() << " has occurred in the mothur.h function sortfile. Please contact Pat Schloss at mothur.bugs@gmail.com." << "\n";
+ exit(1);
+ }
+}
+/**************************************************************************************************/
+inline vector<unsigned long int> setFilePosFasta(string filename, int& num) {
+
+ vector<unsigned long int> positions;
+ ifstream inFASTA;
+ openInputFile(filename, inFASTA);
+
+ string input;
+ while(!inFASTA.eof()){
+ input = getline(inFASTA); gobble(inFASTA);
+ if (input.length() != 0) {
+ if(input[0] == '>'){ unsigned long int pos = inFASTA.tellg(); positions.push_back(pos - input.length() - 1); }
+ }
+ }
+ inFASTA.close();
+
+ num = positions.size();
+
+ /*FILE * pFile;
+ long size;
+
+ //get num bytes in file
+ pFile = fopen (filename.c_str(),"rb");
+ if (pFile==NULL) perror ("Error opening file");
+ else{
+ fseek (pFile, 0, SEEK_END);
+ size=ftell (pFile);
+ fclose (pFile);
+ }*/
+
+ unsigned long int size = positions[(positions.size()-1)];
+ ifstream in;
+ openInputFile(filename, in);
+
+ in.seekg(size);
+
+ while(char c = in.get()){
+ if(in.eof()) { break; }
+ else { size++; }
+ }
+ in.close();
+
+ positions.push_back(size);
+
+ return positions;
+}
+/**************************************************************************************************/
+inline vector<unsigned long int> setFilePosEachLine(string filename, int& num) {
+
+ vector<unsigned long int> positions;
+ ifstream in;
+ openInputFile(filename, in);
+
+ string input;
+ while(!in.eof()){
+ unsigned long int lastpos = in.tellg();
+ input = getline(in); gobble(in);
+ if (input.length() != 0) {
+ unsigned long int pos = in.tellg();
+ if (pos != -1) { positions.push_back(pos - input.length() - 1); }
+ else { positions.push_back(lastpos); }
+ }
+ }
+ in.close();
+
+ num = positions.size();
+
+ FILE * pFile;
+ unsigned long int size;
+
+ //get num bytes in file
+ pFile = fopen (filename.c_str(),"rb");
+ if (pFile==NULL) perror ("Error opening file");
+ else{
+ fseek (pFile, 0, SEEK_END);
+ size=ftell (pFile);
+ fclose (pFile);
+ }
+
+ positions.push_back(size);
+
+ return positions;