More HACMan stuff again
Dependencies: FatFileSystem SDFileSystem mbed
txtFile.cpp@0:ddc821040077, 2015-06-11 (annotated)
- Committer:
- TBSliver
- Date:
- Thu Jun 11 13:50:10 2015 +0000
- Revision:
- 0:ddc821040077
Initial no idea whats here commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
TBSliver | 0:ddc821040077 | 1 | #include "txtFile.h" |
TBSliver | 0:ddc821040077 | 2 | |
TBSliver | 0:ddc821040077 | 3 | |
TBSliver | 0:ddc821040077 | 4 | /** |
TBSliver | 0:ddc821040077 | 5 | * Constructor when called opens a file |
TBSliver | 0:ddc821040077 | 6 | * |
TBSliver | 0:ddc821040077 | 7 | * @param fileAddr |
TBSliver | 0:ddc821040077 | 8 | * the address of the file, either local, sd or whatever |
TBSliver | 0:ddc821040077 | 9 | * @param readWrite |
TBSliver | 0:ddc821040077 | 10 | * whether reading or writing to the file |
TBSliver | 0:ddc821040077 | 11 | */ |
TBSliver | 0:ddc821040077 | 12 | TxtFile::TxtFile(char fileAddr[], char *readWrite, bool doParseFile) { |
TBSliver | 0:ddc821040077 | 13 | |
TBSliver | 0:ddc821040077 | 14 | isFileOpen = false; |
TBSliver | 0:ddc821040077 | 15 | isFileParsed = false; |
TBSliver | 0:ddc821040077 | 16 | currentFilePos = 0; |
TBSliver | 0:ddc821040077 | 17 | |
TBSliver | 0:ddc821040077 | 18 | if ((fp = fopen(fileAddr, readWrite)) == NULL) { |
TBSliver | 0:ddc821040077 | 19 | isFileOpen = false; |
TBSliver | 0:ddc821040077 | 20 | } else { |
TBSliver | 0:ddc821040077 | 21 | isFileOpen = true; |
TBSliver | 0:ddc821040077 | 22 | } |
TBSliver | 0:ddc821040077 | 23 | |
TBSliver | 0:ddc821040077 | 24 | if(doParseFile) { |
TBSliver | 0:ddc821040077 | 25 | parseFile(); |
TBSliver | 0:ddc821040077 | 26 | isFileParsed = true; |
TBSliver | 0:ddc821040077 | 27 | } |
TBSliver | 0:ddc821040077 | 28 | } |
TBSliver | 0:ddc821040077 | 29 | |
TBSliver | 0:ddc821040077 | 30 | /** |
TBSliver | 0:ddc821040077 | 31 | * Destructor when called closes the open file |
TBSliver | 0:ddc821040077 | 32 | */ |
TBSliver | 0:ddc821040077 | 33 | TxtFile::~TxtFile() { |
TBSliver | 0:ddc821040077 | 34 | closeFile(); |
TBSliver | 0:ddc821040077 | 35 | } |
TBSliver | 0:ddc821040077 | 36 | |
TBSliver | 0:ddc821040077 | 37 | /** |
TBSliver | 0:ddc821040077 | 38 | * Returns true if the file is open |
TBSliver | 0:ddc821040077 | 39 | * |
TBSliver | 0:ddc821040077 | 40 | * @returns isFileOpen |
TBSliver | 0:ddc821040077 | 41 | */ |
TBSliver | 0:ddc821040077 | 42 | bool TxtFile::isOpen() { |
TBSliver | 0:ddc821040077 | 43 | return isFileOpen; |
TBSliver | 0:ddc821040077 | 44 | } |
TBSliver | 0:ddc821040077 | 45 | |
TBSliver | 0:ddc821040077 | 46 | /** |
TBSliver | 0:ddc821040077 | 47 | * Returns true if file has been parsed |
TBSliver | 0:ddc821040077 | 48 | * |
TBSliver | 0:ddc821040077 | 49 | * @returns isFileParsed |
TBSliver | 0:ddc821040077 | 50 | */ |
TBSliver | 0:ddc821040077 | 51 | bool TxtFile::isParsed() { |
TBSliver | 0:ddc821040077 | 52 | return isFileParsed; |
TBSliver | 0:ddc821040077 | 53 | } |
TBSliver | 0:ddc821040077 | 54 | |
TBSliver | 0:ddc821040077 | 55 | /** |
TBSliver | 0:ddc821040077 | 56 | * Checks if the file is open, and closes it if it is |
TBSliver | 0:ddc821040077 | 57 | * |
TBSliver | 0:ddc821040077 | 58 | * @returns isClosed |
TBSliver | 0:ddc821040077 | 59 | * returns true if a file was closed, false if not |
TBSliver | 0:ddc821040077 | 60 | */ |
TBSliver | 0:ddc821040077 | 61 | bool TxtFile::closeFile() { |
TBSliver | 0:ddc821040077 | 62 | if (isOpen()) { |
TBSliver | 0:ddc821040077 | 63 | fclose(fp); |
TBSliver | 0:ddc821040077 | 64 | return true; |
TBSliver | 0:ddc821040077 | 65 | } else |
TBSliver | 0:ddc821040077 | 66 | return false; |
TBSliver | 0:ddc821040077 | 67 | } |
TBSliver | 0:ddc821040077 | 68 | |
TBSliver | 0:ddc821040077 | 69 | /** |
TBSliver | 0:ddc821040077 | 70 | * Counts the number of lines, and sets line start positions |
TBSliver | 0:ddc821040077 | 71 | */ |
TBSliver | 0:ddc821040077 | 72 | void TxtFile::parseFile() { |
TBSliver | 0:ddc821040077 | 73 | int c = 0; //current character |
TBSliver | 0:ddc821040077 | 74 | int cPrev = 0; //previous character |
TBSliver | 0:ddc821040077 | 75 | int lengthCount = 0; //local length counter |
TBSliver | 0:ddc821040077 | 76 | int lineCount = 0; //local line counter |
TBSliver | 0:ddc821040077 | 77 | int curPos = 0; //current position in file |
TBSliver | 0:ddc821040077 | 78 | |
TBSliver | 0:ddc821040077 | 79 | if (!isFileParsed) { //check to see if not already done |
TBSliver | 0:ddc821040077 | 80 | seekPos(0); //seek to beginning of file |
TBSliver | 0:ddc821040077 | 81 | |
TBSliver | 0:ddc821040077 | 82 | c = fgetc(fp); //get first character |
TBSliver | 0:ddc821040077 | 83 | fileLineStart[lineCount] = curPos; //first line ALWAYS starts at zero... so far anyway |
TBSliver | 0:ddc821040077 | 84 | |
TBSliver | 0:ddc821040077 | 85 | while (c != EOF) { //while not at the end of the file |
TBSliver | 0:ddc821040077 | 86 | if ((c != '\n') && (c != '\r')) { //if not a newline or carriage return |
TBSliver | 0:ddc821040077 | 87 | lengthCount++; //increment length counter |
TBSliver | 0:ddc821040077 | 88 | } |
TBSliver | 0:ddc821040077 | 89 | |
TBSliver | 0:ddc821040077 | 90 | if (((c == '\n') && (cPrev == '\r')) || ((c == '\r') && (cPrev == '\n'))) { //if a newline (\r\n or \n\r) |
TBSliver | 0:ddc821040077 | 91 | fileLineLength[lineCount] = lengthCount; //set fileLineLength for current line to lengthCount |
TBSliver | 0:ddc821040077 | 92 | lineCount++; //increment line counter |
TBSliver | 0:ddc821040077 | 93 | lengthCount = 0; //reset lengthCount |
TBSliver | 0:ddc821040077 | 94 | fileLineStart[lineCount] = curPos + 1; //set file line start to next position - may not need the +1? |
TBSliver | 0:ddc821040077 | 95 | } |
TBSliver | 0:ddc821040077 | 96 | curPos++; |
TBSliver | 0:ddc821040077 | 97 | cPrev = c; |
TBSliver | 0:ddc821040077 | 98 | c = getc(fp); |
TBSliver | 0:ddc821040077 | 99 | } |
TBSliver | 0:ddc821040077 | 100 | |
TBSliver | 0:ddc821040077 | 101 | noLines = lineCount; |
TBSliver | 0:ddc821040077 | 102 | |
TBSliver | 0:ddc821040077 | 103 | isFileParsed = true; |
TBSliver | 0:ddc821040077 | 104 | seekPos(0); //seek back to the beginning of the file |
TBSliver | 0:ddc821040077 | 105 | } |
TBSliver | 0:ddc821040077 | 106 | } |
TBSliver | 0:ddc821040077 | 107 | |
TBSliver | 0:ddc821040077 | 108 | /** |
TBSliver | 0:ddc821040077 | 109 | * Returns the number of lines in the file |
TBSliver | 0:ddc821040077 | 110 | * |
TBSliver | 0:ddc821040077 | 111 | * @returns noLines |
TBSliver | 0:ddc821040077 | 112 | */ |
TBSliver | 0:ddc821040077 | 113 | int TxtFile::lineCount() ( |
TBSliver | 0:ddc821040077 | 114 | return noLines; |
TBSliver | 0:ddc821040077 | 115 | } |
TBSliver | 0:ddc821040077 | 116 | |
TBSliver | 0:ddc821040077 | 117 | /** |
TBSliver | 0:ddc821040077 | 118 | * Seeks to the position in the current opened file |
TBSliver | 0:ddc821040077 | 119 | * |
TBSliver | 0:ddc821040077 | 120 | * @params seekLoc |
TBSliver | 0:ddc821040077 | 121 | * byte location to seek to |
TBSliver | 0:ddc821040077 | 122 | */ |
TBSliver | 0:ddc821040077 | 123 | void TxtFile::seekPos(int seekLoc) { |
TBSliver | 0:ddc821040077 | 124 | fseek(fp, seekLoc, SEEK_SET); |
TBSliver | 0:ddc821040077 | 125 | currentFilePos = seekLoc; |
TBSliver | 0:ddc821040077 | 126 | } |
TBSliver | 0:ddc821040077 | 127 | |
TBSliver | 0:ddc821040077 | 128 | int TxtFile::getPos() { |
TBSliver | 0:ddc821040077 | 129 | return currentFilePos; |
TBSliver | 0:ddc821040077 | 130 | } |
TBSliver | 0:ddc821040077 | 131 | |
TBSliver | 0:ddc821040077 | 132 | int TxtFile::seekLineStart() { |
TBSliver | 0:ddc821040077 | 133 | int backCount = 0; |
TBSliver | 0:ddc821040077 | 134 | int c = 0; |
TBSliver | 0:ddc821040077 | 135 | |
TBSliver | 0:ddc821040077 | 136 | c = fgetc(fp); //get character at current position |
TBSliver | 0:ddc821040077 | 137 | |
TBSliver | 0:ddc821040077 | 138 | while ((c != '\n') && (c != '\r')) { //check if character is a newline or carriage return |
TBSliver | 0:ddc821040077 | 139 | backCount++; //increment backCount |
TBSliver | 0:ddc821040077 | 140 | fseek(fp, -2, SEEK_CUR); //seek back 2, 1 for the fgetc, 1 more to actually go back one |
TBSliver | 0:ddc821040077 | 141 | c = fgetc(fp); //get a new character |
TBSliver | 0:ddc821040077 | 142 | } |
TBSliver | 0:ddc821040077 | 143 | currentFilePos -= backCount; |
TBSliver | 0:ddc821040077 | 144 | return backCount; |
TBSliver | 0:ddc821040077 | 145 | } |
TBSliver | 0:ddc821040077 | 146 | |
TBSliver | 0:ddc821040077 | 147 | int TxtFile::seekLineEnd() { |
TBSliver | 0:ddc821040077 | 148 | int count = 0; |
TBSliver | 0:ddc821040077 | 149 | int c = 0; |
TBSliver | 0:ddc821040077 | 150 | |
TBSliver | 0:ddc821040077 | 151 | c = fgetc(fp); //get character at position after the newline or carriage return |
TBSliver | 0:ddc821040077 | 152 | |
TBSliver | 0:ddc821040077 | 153 | while ((c != '\n') && (c != '\r')) { //check if character is a newline or carriage return |
TBSliver | 0:ddc821040077 | 154 | count++; //increment main counter |
TBSliver | 0:ddc821040077 | 155 | c = fgetc(fp); //get a new character |
TBSliver | 0:ddc821040077 | 156 | } |
TBSliver | 0:ddc821040077 | 157 | currentFilePos += count; |
TBSliver | 0:ddc821040077 | 158 | return count; |
TBSliver | 0:ddc821040077 | 159 | } |
TBSliver | 0:ddc821040077 | 160 | |
TBSliver | 0:ddc821040077 | 161 | void TxtFile::seekLine(int line) { |
TBSliver | 0:ddc821040077 | 162 | if(isFileParsed) { |
TBSliver | 0:ddc821040077 | 163 | seekPos(fileLineStart[line - 1]); |
TBSliver | 0:ddc821040077 | 164 | } |
TBSliver | 0:ddc821040077 | 165 | } |
TBSliver | 0:ddc821040077 | 166 | |
TBSliver | 0:ddc821040077 | 167 | /** |
TBSliver | 0:ddc821040077 | 168 | * Returns the line length of the current line the 'seek head' is on |
TBSliver | 0:ddc821040077 | 169 | * |
TBSliver | 0:ddc821040077 | 170 | * @returns lineLength |
TBSliver | 0:ddc821040077 | 171 | */ |
TBSliver | 0:ddc821040077 | 172 | int TxtFile::lineLength() { |
TBSliver | 0:ddc821040077 | 173 | int count; //initialise all values needed |
TBSliver | 0:ddc821040077 | 174 | |
TBSliver | 0:ddc821040077 | 175 | seekLineStart(); |
TBSliver | 0:ddc821040077 | 176 | |
TBSliver | 0:ddc821040077 | 177 | count = seekLineEnd(); |
TBSliver | 0:ddc821040077 | 178 | |
TBSliver | 0:ddc821040077 | 179 | return count; //return count, which is the number of characters in the line |
TBSliver | 0:ddc821040077 | 180 | } |
TBSliver | 0:ddc821040077 | 181 | |
TBSliver | 0:ddc821040077 | 182 | /** |
TBSliver | 0:ddc821040077 | 183 | * |
TBSliver | 0:ddc821040077 | 184 | */ |
TBSliver | 0:ddc821040077 | 185 | void csvToIntArray(int line, int arrayStart, int arrayEnd, int *array) { |
TBSliver | 0:ddc821040077 | 186 | |
TBSliver | 0:ddc821040077 | 187 | |
TBSliver | 0:ddc821040077 | 188 | // int i = char a - '0' <---- really easy way to convert char to int. :D |
TBSliver | 0:ddc821040077 | 189 | } |