C++ Filhanterings-problem

Här pratar vi programmering i dessa olika former. Perl, C/C++, Pascal, ADA, Lisp, COBOL, ZX Basic och mm.
Post Reply
User avatar
panzar
Posts: 100
Joined: 23 April 2003, 22:07

C++ Filhanterings-problem

Post by panzar » 25 January 2004, 14:42

Filhanterings-problem.

Jag håller på med en liten enkel kalender i C++ och ncurses, men har stött på lite problem med en funktion som ska ta bort ett "record". Alla "records" lagras i en textfil (på en enskild rad) enligt mallen: dag/månad#text@
Exempel: 25/1#Matte prov@

Jag fick ett tips om att jag skulle loopa igenom alla rader i textfilen (där alla records är lagrade) och jämföra med den raden jag ville ta bort. Sålänge den raden jag ville ta bort inte hittades så skulle jag skriva samma rad i en annan fil, när man träffade på det "record'et" man sökt efter skulle man bara låta bli att skriva det i den nya filen.

Jag har försökt skapa en funktion som fungerar på det här sättet, men det blir inte riktigt som jag vill. Det luriga är att det är flera olika fel som uppstår beroende på hur många records som finns sparade. Ibland fungerar inte radbrytningen, utan alla records skrivs på samma rad i den nya filen - funktionen first_post som jag använder för att undvika det, vill inte fungera i detta fallet. Den fungerar på alla andra ställen i programmet men inte här, så jag misstänker att det inte har med den funktionen att göra heller. Ibland så skrivs inte några records alls i den nya filen osv.

Klistrar in dom två aktuella funktionerna här, ifall ni skulle upptäcka nåt fel. Men det enklaste är nog att dra ner hela mitt program och testa, då ser ni ju vad som skrivs i records.txt och records2.txt och då blir det nog enklare att felsöka.

http://panzar.hjolug.org/school-cal.tar.gz

Code: Select all

// Function for deleting a record.
int delete_record()
{
	echo();
	int match = 0, c;
	char search_text[30], search_date[20], rad[100], rad2[100];
	char *rec_date, *rec_text, *rec_line;
	ifstream records;
	ofstream update;

	records.open("data/records.txt");
	
	wclear(wins[8]);
	mvwprintw(wins[8], 0, 0, "Ta bort notis\n----------------\nMata in notisens text: ");
	wrefresh(wins[8]);
	wgetstr(wins[8], search_text);
	
	mvwprintw(wins[8], 3, 0, "Mata in notisens datum (ex. 26/1): ");
   wrefresh(wins[8]);
	wgetstr(wins[8], search_date);

	if (first_post("data/records.txt")) { // If there is'nt any notes saved, go back to the menu.
		mvwprintw(wins[8], 0, 0, "Ta bort notis\n------------------\nDet finns inga notiser sparade.\nTryck på valfri tangent för att komma tillbaks till menyn.");
		wrefresh(wins[8]);
		getch();
		
		noecho();
		do_screen();
		do_menu();
		return 0;
	}
	
	while (!records.eof()) { // Loop through the records-file and try to match the user-input against the records.
		records.getline(rad, 100);
		sscanf(rad, "%[^\n]", rec_line);
		rec_date = strtok(rad, "#");
		rec_text = strtok(NULL, "@");
		if (strcmp(rec_date, search_date) == 0 && strcmp(rec_text, search_text) == 0) { // If the record was found, set the match-variable.
			match = 1;
			break;
		}
	}
	records.close();
	
	noecho();
	wclear(wins[8]);
	if (match == 1) {
		mvwprintw(wins[8], 0, 0, "Ta bort notis\n------------------\nNotis hittad: \"%s %s\"\nSäker på att du vill ta bort denna notis (J/N)? ", rec_date, rec_text);
		wrefresh(wins[8]);
		
		if ((c = getch()) == 'J' || c == 'j') {	
			records.open("data/records.txt");
			update.open("data/records2.txt");
			while (!records.eof()) {
				records.getline(rad2, 100);
				if (!strcmp(rad2, rec_line) == 0) {
					if (first_post("data/records2.txt")) // If it's the first record that should be written, don't do any break-line. 
						update << rad2;
					else
						update << endl << rad2;
				}
			}
					
			mvwprintw(wins[8], 2, 0, "Notisen \"%s %s\" borttagen.\nTryck valfri tangent för att komma tillbaks till menyn.", rec_date, rec_text);
			wrefresh(wins[8]);
			getch();
		}
		else {
			mvwprintw(wins[8], 2, 0, "Notisen: \"%s %s\" ej borttagen.\nTryck valfri tangen för att komma tillbaks till menyn.", rec_date, rec_text);
			wrefresh(wins[8]);
			getch();
		}
	}
	else {
		mvwprintw(wins[8], 0, 0, "Ta bort record\n------------------\nDet fanns ingen notis som matchade sökningen: \"%s %s\"\nTryck valfri tangent för att komma till menyn.", search_date, search_text);
		wrefresh(wins[8]);
		getch();
	}		
	records.close();
	update.close();
	
	do_screen();
	do_menu();
	return 0;
}
Och den andra funktionen.

Code: Select all

bool first_post(char file[])
{
	char rad[100];
	char tecken;
	int tal;
	ifstream records;

	records.open(file);
	
	if (!records.is_open()) // If the file doesn't exist, it must be the first record. 
		return true;

	records.getline(rad, 100);
	sscanf(rad, "%d %c", &tal, &tecken);
	if (tecken == '/') // Check if the first line contains "/", then it must exist a record.
		return false; // It's not the first record.
	else 
		return true; // It's the first record.

	records.close();
}

Tack på förhand![/code]

Post Reply