I have this code where I take a file name and generate a new file with the same file name but ending in .c
However, when I attempt to transform the file name to end in a .c, I try to print the result to check if it’s working. And printf just prints nothing. If it makes a difference, the file name is a pointer that points to argv[1] from int main(int argc, char *argv[]).
Here is the code:
bool file_genEquiCFile(char *file_name)
{
// Maybe add a memmove to preserve the original buffer
printf("file_name before change: %s\n", file_name);
while (file_name && *file_name != '.')
file_name++;
if (file_name)
{
if (*file_name++ == '.')
{
*file_name++ = 'c';
*file_name = '\0';
// For now use "w" mode which makes an empty file for writing.
FILE *c_file = fopen(file_name, "w");
fclose(c_file);
printf("file_name after change: %s\n", file_name);
return true;
}
else
return false;
}
return false;
}
By the way, file_name points to a file called hey.txt
Here is what printf printed:
file_name before change: hey.txt
file_name after change:
>Solution :
After *file_name = '\0';
, file_name
points at a 0-character string because what file_name
points at is the terminating NUL character.
You should store the original file_name
at the beginning of the function and use it later instead of the modified file_name
later.
bool file_genEquiCFile(char *file_name)
{
char *file_name_orig = file_name;
// Maybe add a memmove to preserve the original buffer
printf("file_name before change: %s\n", file_name);
while (file_name && *file_name != '.')
file_name++;
if (file_name)
{
if (*file_name++ == '.')
{
*file_name++ = 'c';
*file_name = '\0';
// For now use "w" mode which makes an empty file for writing.
FILE *c_file = fopen(file_name_orig, "w");
fclose(c_file);
printf("file_name after change: %s\n", file_name_orig);
return true;
}
else
return false;
}
return false;
}
Also you may want to use *file_name
instead of file_name
in the first while
and if
to check not if the pointer is not NULL
but if what the pointer points at is a NUL character.