テキスト ファイルを 1 つずつ処理し、関連情報を抽出するプログラムを作成しました。私のプログラムは、一部のテキスト ファイルでは正常に動作し、その他のファイルでは正常に動作しません。私のプログラムでシームレスに実行されるファイルとそうでないファイルの間に明らかな違いはありません。
問題のあるファイルに関する限り:
- プログラムはファイルを開きます
- 必要に応じて、行のかなりの部分を一度に 1 つずつ読み込んで処理します。
しかし、その後、問題のある行に到達し、エラー メッセージが表示されます。
「Debug Assertion Failed File: f:/dd/vctools/crt_bld/self_x86/src/isctype.c Line: 56 Expression: (unsigned)(c+1) <= 256」
デバッガー モードに入ると、以下のコードの "while(tokenScanner)" ループから問題が発生するようです。</li>
処理中の問題行の内容を取り出して、いくつかの問題ファイル間で比較したところ、処理中の最後のトークンが ">"である場所にアサーション失敗メッセージが表示されることがわかりました。なぜこれが問題なのかはわかりません。元のテキスト ファイル内のこの特定のトークンは<li
、フォーム内で連続しています</li><li
。したがって、スキャナはこの文字列の途中で問題を抱えています。これがなぜなのか、どうすれば修正できるのかについて何か考えはありますか? どんなアドバイスでも大歓迎です!
私のコードの関連部分は次のとおりです。
#include <string>
#include <iostream>
#include <fstream> //to get data from files
#include "filelib.h"
#include "console.h"
#include "tokenScanner.h"
#include "vector.h"
#include "ctype.h"
#include "math.h"
using namespace std;
/*Prototype Function*/
void evaluate(string expression);
Vector<string> myVectorOfTokens; //will store the tokens
Vector<string> myFileNames;
/*Main Program*/
int main() {
/*STEP1 : Creating a vector of the list of file names
to iterate over for processing*/
ifstream infile; //declaring variable to refer to file list
string catchFile = promptUserForFile(infile, "Input file:");
string line; //corresponds to the lines in the master file containing the list files
while(getline(infile, line)){
myFileNames.add(line);
}
/* STEP 2: Iterating over the file names contained in the vector*/
int countFileOpened=0; //keeps track of number of opened files
for (int i=1; i< myFileNames.size(); i++){
myVectorOfTokens.clear(); //resetting the vector of tokens for each new file
string fileName;
string line2;
ifstream inFile;
fileName= myFileNames[i];
inFile.open(fileName.c_str()); //open file convert c_str
if (inFile){
while(getline(inFile, line2)){
evaluate(line2);
}
}
inFile.close();
countFileOpened++;
}
return 0;
}
/*Function for Extracting the Biographer Name*/
void evaluate(string line){
/*Creating a Vector of Tokens From the Text*/
TokenScanner scanner(line); //the constructor
while (scanner.hasMoreTokens()){
string token=scanner.nextToken();
myVectorOfTokens.add(token);
}
}