Adds line removing
Allows you to remove a specific ID in the book DB this will also update the subsequent lines to be in numerical order
This commit is contained in:
parent
ebebe13f0e
commit
612224a100
49
src/csv.c
49
src/csv.c
@ -31,14 +31,34 @@ int get_next_id()
|
|||||||
return atoi(id) + 1;
|
return atoi(id) + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
long find_id(int id_to_find)
|
void update_line(char** line, int new_id)
|
||||||
{
|
{
|
||||||
FILE* csv;
|
int i;
|
||||||
char* buffer;
|
char* buffer;
|
||||||
size_t line_size = MAX_BUFFER_SIZE - 1;
|
for (i = 0; i < MAX_BUFFER_SIZE; i++) {
|
||||||
int i, file_exists;
|
if ((*line)[i] == ',')
|
||||||
long file_pos;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i == MAX_BUFFER_SIZE - 1) {
|
||||||
|
fprintf(stderr, "There was an error in %s file!\n", FILE_NAME);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer = malloc(sizeof(char) * MAX_BUFFER_SIZE);
|
||||||
|
strncpy(buffer, (*line) + i, MAX_BUFFER_SIZE);
|
||||||
|
|
||||||
|
snprintf(*line, MAX_BUFFER_SIZE, "%d%s", new_id, buffer);
|
||||||
|
free(buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
void remove_line_from_file(int id_to_remove)
|
||||||
|
{
|
||||||
|
int file_exists, line_count;
|
||||||
|
FILE* csv;
|
||||||
|
FILE* new_csv;
|
||||||
|
char* line;
|
||||||
|
size_t line_size = MAX_BUFFER_SIZE;
|
||||||
|
|
||||||
file_exists = access(FILE_NAME, F_OK);
|
file_exists = access(FILE_NAME, F_OK);
|
||||||
if (0 != file_exists) {
|
if (0 != file_exists) {
|
||||||
@ -52,16 +72,25 @@ long find_id(int id_to_find)
|
|||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
for(i = 0; i < id_to_find + 1; i++)
|
new_csv = fopen("temp.csv", "w");
|
||||||
getline(&buffer, &line_size, csv);
|
|
||||||
|
|
||||||
file_pos = ftell(csv);
|
line_count = 0;
|
||||||
|
while(getline(&line, &line_size, csv) != -1) {
|
||||||
|
if (id_to_remove > line_count) {
|
||||||
|
fprintf(new_csv, "%s", line);
|
||||||
|
} else if (id_to_remove < line_count) {
|
||||||
|
update_line(&line, line_count - 1);
|
||||||
|
fprintf(new_csv, "%s", line);
|
||||||
|
}
|
||||||
|
line_count++;
|
||||||
|
}
|
||||||
|
fclose(new_csv);
|
||||||
fclose(csv);
|
fclose(csv);
|
||||||
|
|
||||||
return file_pos;
|
remove(FILE_NAME);
|
||||||
|
rename("temp.csv", FILE_NAME); // new csv is now the original file, without that line
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void write_to_file(book_t* book)
|
void write_to_file(book_t* book)
|
||||||
{
|
{
|
||||||
FILE* file;
|
FILE* file;
|
||||||
|
17
src/csv.h
17
src/csv.h
@ -19,11 +19,20 @@ int get_next_id();
|
|||||||
void write_to_file(book_t* book);
|
void write_to_file(book_t* book);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* long find_id
|
* void remove_line_from_file
|
||||||
* int id_to_find - The ID we're looking for
|
* int id_to_remove - The book ID that we don't want anymore
|
||||||
*
|
*
|
||||||
* Returns the position of a FILE to the line with the ID we're looking for
|
* Removes a book from the CSV file
|
||||||
*/
|
*/
|
||||||
long find_id(int id_to_find);
|
void remove_line_from_file(int id_to_remove);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* void update_line
|
||||||
|
* char** line - Pointer to the book entry string
|
||||||
|
* int new_id - The new ID that should be placed into this book entry
|
||||||
|
*
|
||||||
|
* Takes a book entry and changes the ID to the given one
|
||||||
|
*/
|
||||||
|
void update_line(char** line, int new_id);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
18
src/main.c
18
src/main.c
@ -58,6 +58,7 @@ void do_ISBN_get(char* argv[])
|
|||||||
|
|
||||||
void process_args(char* argv[])
|
void process_args(char* argv[])
|
||||||
{
|
{
|
||||||
|
int id;
|
||||||
if (0 == strcmp(argv[1], "--help")) {
|
if (0 == strcmp(argv[1], "--help")) {
|
||||||
printf("%s - An ISBN lookup tool.\n", argv[0]);
|
printf("%s - An ISBN lookup tool.\n", argv[0]);
|
||||||
printf("Author: Nathan Singer\n");
|
printf("Author: Nathan Singer\n");
|
||||||
@ -68,8 +69,19 @@ void process_args(char* argv[])
|
|||||||
puts("[isbn] -- Attempts to download a book from the given ISBN-10 or ISBN-13 input.");
|
puts("[isbn] -- Attempts to download a book from the given ISBN-10 or ISBN-13 input.");
|
||||||
puts("remove [id] -- Removes a book with the given ID from the book database.");
|
puts("remove [id] -- Removes a book with the given ID from the book database.");
|
||||||
} else if (0 == strcmp(argv[1], "remove")) {
|
} else if (0 == strcmp(argv[1], "remove")) {
|
||||||
// remove a book here
|
if (NULL == argv[2]) {
|
||||||
return;
|
printf("Not enough arguments! Try typing %s --help\n", argv[0]);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
id = atoi(argv[2]);
|
||||||
|
|
||||||
|
if (0 == id) {
|
||||||
|
printf("Invalid book ID given!\n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
remove_line_from_file(id);
|
||||||
} else {
|
} else {
|
||||||
// lets assume its an ISBN and let the other functions fail if its not
|
// lets assume its an ISBN and let the other functions fail if its not
|
||||||
do_ISBN_get(argv);
|
do_ISBN_get(argv);
|
||||||
@ -80,8 +92,6 @@ void process_args(char* argv[])
|
|||||||
|
|
||||||
int main(int argc, char* argv[])
|
int main(int argc, char* argv[])
|
||||||
{
|
{
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (1 == argc) {
|
if (1 == argc) {
|
||||||
printf("Not enough arguments! Try typing %s --help\n", argv[0]);
|
printf("Not enough arguments! Try typing %s --help\n", argv[0]);
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user