which, as I explained will lead to problems: you will either get strange results, or a program crash. If you are going to store data in the buffer returned from malloc then you must allocate enough space for the data you are going to copy into it. Anything less will cause your program to overwite other variables.
OK, let us say that you have a path ("C:\Users\Noname\Documents\Test") in argv, and you now want to inspect a subdirectory called "images":
int argvSize = strlen(argv); // the number of characters in the base path// calculate the space needed for the subdirectory as follows:// the length of the base path (argv)// plus the length of the new subdirectory// plus one for the backslash separator in front of the new directory// plus 1 for the trailing null character//int mallocSize = argvSize + strlen(subdir) + 1 + 1;
char* newPath = (char*)malloc(mallocSize);
strcpy(newPath, argv); // copy the root path
strcat(newPath, "\\"); // add a single trailing backslash - note two \\ required here,// as the first one is treated as the escape character
strcat(newPath, subdir); // append the new directory name at the end.// The trailing null is appended automatically by strcat// newPath should now contain:// C:\Users\Noname\Documents\Test\images
Yes because you are using the count from location to do the copy, which is the length of the string, and so will not include the null character. Use the code sample I gave you which makes use of standard library functions that will ensure your copied data is correctly structured.
a random user wrote:
is there any way we could communicate like through skype ?
Sorry, I do this in my own time and at my own speed. I will not be available much longer today.
I did what you told me but the results are still the same
That's because you did not do what I told you. You are still copying your path strings based on strlen rather than strlen+1. And you seem to be creating too many variables, most of which are just duplicates of existing items. This may well be what is causing you confusion.
That is because you keep doing the same thing wrong. You need to stop and think, and reread all my posts that explain how to do it properly. Especially look closely at the sample code I posted yesterday
i did do waht you told me i expended the string by 1
but that 1 byte is messing up my code
even trying using strcat just makes it worse I stopped and read all of ur recent psots but i have nothign that comes in mind that could help me
im sorry for giving you a hard time here but it is hard for me as it is
would you please fix the code to show me what you mean?
I did calculate the bytes and the characters as i needed it needs to be 24 bytes
when at the last code i posted you can see that until i reach to the point that is /1 its 23 bytes
the + 1 is the one i added so it will be the end of the string
Looks to me like you're most of the way there. You probably want to read in your reference file into a buffer. You can use _stat() to get the file size for malloc().
Next, it depends on where the signatures are in the file. If they're at a known location you could use fseek(), fread() and memcmp() to determine if the signature is in the file or not. If the signatures are at a random location, I'd pull the entire file into a malloced buffer (_stat() again), and then search through the buffer. The simple way would be use memcmp() at locations 0 ... (current_file_size - reference_file_size), but there's more efficent ways of going about that. If you know that there's no null chars in the either file (unlikely), maybe strstr() is an option.
some notes on what you have so far:
sizes, and sizes will not change over the while loop, so they could be computed before entering the loop. strlen("\\") is 1, not 2
you not calling free(string) within the while loop, so you're leaking memory. If you use my suggestion about slurping the file into memory, don't forget to free() that buffer too.
First you need to write down the steps you require to do the searching. Something like:
Read 'key' file and extract its signature
For each file in directory
Open next file
Read some data (maybe a small amount, maybe all, or maybe just some specific block)
If the key-file signature is in the data of this file
Do file match processing
Do file no match processing (if necessary)
Until (no more files)
Once you have all the steps clearly defined it should not be too difficult to turn that into code.
A folder in a folder is just a new path to search. When you get a directory in your dirent search, you just append a backslash '\\' followed by the directory name to the string you got from argv (or the current path), and start a new search. Say you start your program by:
and your found entry is a directory named Music, you would create a new path C:\Users\Random\Lists\Music and continue with that. Don't forget to ignore directories named . and .. as they lead back up the tree.