makefile
FLAGS = -Os MYAPP = appname all: $(MYAPP) $(MYAPP): $(MYAPP).o hbstring.o g++ $(MYAPP).o -o $(MYAPP) -static-libgcc -static-libstdc++ $(MYAPP).o: $(MYAPP).cpp g++ -c -g -std=c++0x $(MYAPP).cpp clean: rm *.o $(MYAPP)
map / hash / dictionary
#include <map>
...
std::map <std::string, int> mymap;
for(auto itr = mymap.begin(); itr != mymap.end(); itr++){
std::string key = itr->first;
int value = itr->second;
}
Determine type of File system Object a given string is, including "none" :
enum FSO_TYPE {none, file, dir, dot};
FSO_TYPE fsotype(std::string);
...
...
...
FSO_TYPE fsotype(std::string str)
{
if(str == "." || str == "..")
return dot;
struct stat sb;
if(stat(str.c_str(), &sb) == 0){
// the string does represent some kind of non-parent, non-self filesystem object
if(S_ISDIR(sb.st_mode)){
return dir;
}
else{
return file;
}
}
else{
return none;
}
}
Check for the existence of an image file with a given base name:
std::string getimage(std::string searchfolder, std::string basename);
...
...
...
std::string getimage(std::string searchfolder, std::string basename)
{
std::vector <std::string> extensions;
extensions.push_back(".jpg");
extensions.push_back(".jpeg");
extensions.push_back(".png");
extensions.push_back(".webp");
extensions.push_back(".tiff");
for(auto & ext: extensions){
std::string testpath = searchfolder + "/" + basename + ext;
if(fsotype(testpath) == file){
return testpath;
}
}
return ""
}
Get the names of all of a folder's files and subfolders, sort them, and process the sorted vectors of names:
// you probably want to changedir to make life easier
// remember, you are only getting back the base names of the FSOs
// so you might want to be sitting in their parent folder
// as you process them.
// Either that, or you will need to build the path when you reference the FSO names in the file system
chdir("root folder name");
DIR* folder = opendir(".");
vector <std::string> folders;
vector <std::string> files;
struct dirent *folderitem;
while((folderitem = readdir(folder)) != NULL){
std::string fsoname = folderitem->d_name;
if(fsotype(fsoname) == file){
files.push_back(fsoname);
}
else if (fsotype(fsoname) == dir){
folders.push_back(fsoname);
}
}
closedir(folder);
sort(files.begin(), files.end());
sort(folders.begin(), folders.end());
for(auto & folder: folders){
cout << folder << endl;
}
for(auto & file: files){
cout << file << endl;
}
Read a file and write to a file
#include <stdio>
#include <iostream>
#include <fstream>
char line[9999];
FILE *infile;
infile = fopen("TheMonstersKnow.txt", "r");
std::ofstream outfile;
outfile.open("out.txt", ofstream::out);
while(fgets(line, 9999, infile) != NULL){
line[std::strcspn(line, "\n")] = 0; // remove \n from the end
hbtrim(line);
outfile << line << std::endl;
}
fclose(infile);
outfile.close();
...
...
...
void hbtrim(char* sz)
{
char temp[9999];
int n= 0;
while(sz[n] == ' '){
n++;
}
strcpy(temp, sz + n);
int l = strlen(temp);
while(temp[l - 1] == ' '){
temp[l - 1] = 0;
l--;
}
strcpy(sz, temp);
}
ncurses
#include <ncurses.h>
// init ncurses
initscr();
clear();
// use ncurses, do not mix with cout output
move(line, row); // zero-based
printw("%d) string with printf formatting %s", n, "in this example menu entry");
move(line + 1, 0); // put the cursor for input on the next line
refresh();
int ch = getch(); // gets the next keystroke
char c = ch; // necessary? going to treat c/ch only a a char
int a = c - '0';
if(a >= 0 && a <= 9){
move(line + 2, 0) ;
printw("You entered a digit");
}
// cleanup
endwin();
makefile: -lncurses
mysql
I think executeQuery is only for non-update/insert queries (so they return database information), and executeUpdate is for update/insert queries. Maybe execute is generic for either?
compile linking: -lmysqlcppconn
#include <mysql/jdbc.h>
...
...
...
sql::mysql::MySQL_Driver *driver;
sql::Connection *connection;
driver = sql::mysql::get_mysql_driver_instance();
connection = driver->connect("tcp://10.0.0.51:3306", "sean", "batman");
sql::Statement *statement;
sql::ResultSet *queryresults;
statement = connection->createStatement();
statement->execute("USE hubris");
queryresults = statement->executeQuery("select name, fullname from creatures where name like '%Dragon' order by name");
int resultcount = queryresults->rowsCount();
while(queryresults->next()){
string name = queryresults->getString("name");
string fullname = queryresults->getString("fullname");
}
statement->executeUpdate("UPDATE hubris.creatures SET link = "some url" WHERE name = 'stormGiant'");
Remove the newline char at the end of a string from fgets
while(fgets(line, 9999, infile) != NULL){
line[strcspn(line, "\n")] = 0;
Remove unwanted characters from a string, and control capitalization.
enum hbcase {upper, lower, asis};
std::string styleString(std::string, char*, hbcase, hbcase, hbcase);
...
...
...
std::string styleString(std::string strsrc, char* unwanted, hbcase firstchar, hbcase newword, hbcase therest)
{
char retstr[9999];
int c2 = 0;
char src[9999];
strcpy(src, strsrc.c_str());
int l = strlen(src);
switch(firstchar){
case upper:
src[0] = toupper(src[0]);
break;
case lower:
src[0] = tolower(src[0]);
break;
};
for(int c = 0; c < l; c++){
bool skip = false;
for(int cc = 0; cc < strlen(unwanted); cc++){
if(src[c] == unwanted[cc]){
skip = true;
}
}
if(!skip){
retstr[c2] = (src[c]);
if(c && (src[c - 1] == ' ' || src[c - 1] == '-')){
switch(newword){
case upper:
retstr[c2] = toupper(retstr[c2]);
break;
case lower:
retstr[c2] = tolower(retstr[c2]);
break;
};
}
else{
switch(therest){
case upper:
retstr[c2] = toupper(retstr[c2]);
break;
case lower:
retstr[c2] = tolower(retstr[c2]);
break;
};
}
c2++;
}
}
retstr[c2] = 0;
return (std::string) retstr;
}
DESC
CODE