2017-06-07 15 views
1

現在、テキストファイルからデータを読み込み、そのデータをリンクリストに配置するプログラムで作業しています。私は何をやっているのか分かりましたが、ファイル内のデータフォーマットにエラーがあれば、次の行にジャンプするエラー処理を含めることになっています。テキストファイルからリンクリストへのデータ読み込み、エラー処理

このファイルには、モデルの形式の一連のターミネータとシリアル番号に関する情報が含まれています。

読み取ることができるデータの例である:上記の最初の行で

TERMINATOR T-800 1 

TERMINATOR T-1000 2 

TERMINATOR T-800 3 

TERMINATOR T-800 4 

、T-800モデルであり、1は、シリアル番号です。上記の4つの行はすべて有効ですが、5行目は、このようなものになります場合:

TORMONUTTUR T-800 1h6 

か:

abc 2 

を、データは破棄されなければならないとプログラムは次の行を読み続けるべき。

私はこの問題をどのようにして始めるべきかわからないので、これは現在失われており、正しい方向にうなずきます。

+3

"私は現在、テキストファイルからデータを読み込むはずのプログラムに取り組んでいます" - それ以外の広範な質問に問題を明確にするためにこれまで行ってきたことを投稿します。 – chux

答えて

0

たとえば、シリアル番号がintの場合、1h6が切り捨てられ、有効かどうかを確認できないため、行のすべての部分を文字列として読み取ることができます。シリアル番号文字列については、それが本当に整数かどうかを確認し、そうであればstd::stoiで数値に変換してください。

Georgioss-のMacBook-Proの::〜gsamarasの$猫

TERMINATOR T-800 1 

TERMINATOR T-1000 2 

TERMINATOR T-800 3 

TERMINATOR T-800 4 

TORMONUTTUR T-800 1h6 

abc 2 
thefile.txtのファイルのどの

#include <fstream> 
#include <iostream> 
#include <string> 

inline bool isInteger(const std::string & s) 
{ 
    if(s.empty() || ((!isdigit(s[0])) && (s[0] != '-') && (s[0] != '+'))) return false ; 

    char * p ; 
    strtol(s.c_str(), &p, 10) ; 

    return (*p == 0) ; 
} 

int main(void) 
{ 

    std::ifstream infile("thefile.txt"); 
    if (infile.is_open()) { 
     int serial_number; 
     std::string model, terminator, serial_number_str; 
     while (infile >> terminator >> model >> serial_number_str) 
     { 
      if(terminator == "TERMINATOR" && isInteger(serial_number_str)) 
      { 
       serial_number = std::stoi(serial_number_str); 
       std::cout << terminator << " " << model << " " << serial_number << "\n"; 
      } 
     } 
    } 
    infile.close(); 
    return 0; 
} 

:私のanswerHow do I check if a C++ string is an int?から

は、私はこれを得ました

は:

Georgioss-MacBook-Pro:~ gsamaras$ g++ main.cpp 
Georgioss-MacBook-Pro:~ gsamaras$ ./a.out 
TERMINATOR T-800 1 
TERMINATOR T-1000 2 
TERMINATOR T-800 3 
TERMINATOR T-800 4 

std::regexを使用してさらに改善し、modelの形式を確認できます。

+1

あなたはC++を使っていますが、答えはCとタグ付けされています。 – kamoroso94

1

あなた自身を圧倒しないための1つの方法は、異なるアクションを異なる機能に委任して、すべてを一度に心配する必要がないようにすることです。ファイルを開いて一度に1行ずつ読むことをお勧めします。各行について、書式を検証し、リンクされたリストにデータを追加します。それ以外の場合は何もせずに次の行に進みます。それはこのようなものかもしれません。

char line[128]; 
while(fgets(line, 128, (FILE*)fh) != NULL) { 
    if(isValidLine(line)) { 
     // add data to linked list 
    } 
} 

ロジックが分かりやすいです。関数isValidLineを定義して、その行に有効なデータがあることを確認し、対応するブール値を返すだけです。これを検証するには、sscanfまたは他の文字列トークナイザを使用して行を解析するか、手動で行えます。たとえば、文字列が"TERMINATOR "で始まっていることを確認し、そこから進んでください。すべてがチェックアウトされ、trueを返しますが、文字列がフォーマット要件を満たさない場合はいつでもfalseを返します。

関連する問題