2

I am using Code::Blocks and have set the command-line arugments via the IDE. I have also opened the executable with the proper argument and I can't manage to get a non-NULL on fopen() return. I've tried hard-coding the filename also with no success. The platform is Windows XP SP3.

The first is the one that fails, when i hardcoded it i used double backlash. Also i never knew if the second works because i never managed to start the process by opening the first one.

Obviously i put the text file in the same directory that the executable and rebuilt the executable many times, but it still doesn't work.

EDIT: I added the perror("fopen"); line in the if(finput==NULL) block. This is the output.

http://prntscr.com/h71pa

#include <stdio.h> #include <stdlib.h> #include <string.h> #define first_part_url "[url=http://magiccards.info/query?q=" #define second_part_url "&v=card&s=cname]" #define end_bracket "[/url]\n" #define output_file_prefix "output_" char* get_card(FILE* finput); int main(int n, char* arguments[]) { FILE* finput; FILE* foutput; short int counter; char* output_filename; char* finalstring; for(counter=1; counter<n; counter++) { finput=fopen(arguments[counter], "r"); if (finput==NULL) { printf("Unable to open "); puts(arguments[counter]); perror("fopen"); break; } strcpy(output_filename, output_file_prefix); strcat(output_filename, arguments[counter]); if((foutput=fopen(output_filename, "w"))==NULL) { printf("There was an error while trying to open "); puts(arguments[counter]); printf(" .\n"); break; } while(!feof(finput)) { finalstring=get_card(finput); fputs(finalstring, foutput); while(((fgetc(finput))!='\n')||feof(finput)); } printf("Autocarding "); puts(arguments[counter]); printf(" was a success.\n"); fclose(foutput); } if(finput!=NULL) { fclose(finput); free(finalstring); } return 0; } char* get_card(FILE* finput) { char* currentcard; char* finalstring; currentcard=(char*)malloc(sizeof(char)*150); fgets(currentcard, 150, finput); /* Allocates the exact amount of space needed for the final string*/ finalstring=(char*)malloc(sizeof(char)*(strlen(first_part_url)+strlen(second_part_url)+strlen(end_bracket)+strlen(currentcard))); /* Get all the final forum link together*/ strcat(finalstring, first_part_url); strcat(finalstring, currentcard); strcat(finalstring, second_part_url); strcat(finalstring, end_bracket); free(currentcard); return finalstring; } 
8
  • Which one fails, the first or the second? Commented Oct 11, 2012 at 0:46
  • When you hard coded the file name, did you use a single or double backslash as the path separator? Commented Oct 11, 2012 at 0:49
  • The first is the one that fails, when i hardcoded it i used double backlash. Also i never knew if the second works because i never managed to start the process by opening the first one. Commented Oct 11, 2012 at 0:53
  • In the case where fopen() returns NULL, add a call to perror("fopen"); - this will print a message from the OS describing why the open failed. Commented Oct 11, 2012 at 1:04
  • 1
    Great, you have changed the source code again, and... now strcpy() attempts to write to nobody knows where because output_filename is not even initialized. Do NOT keep changing the code in the question. Append newer versions, but don't change the original one because if you keep changing it, answering the question becomes pointless, because it changes! Commented Oct 11, 2012 at 1:38

3 Answers 3

2

The error you are getting, "No such file or directory" indicates that the file name you're trying to open doesn't exist.

In this case, it's probably because the program's current working directory is not the same as the directory containing the executable file.

Sign up to request clarification or add additional context in comments.

3 Comments

This is almost certainly the underlying problem. When a process is started, it has a "current directory" which is not necessarily the same directory as the location of the executable. Code::Blocks might be setting the current directory somewhere else (like the project directory).
Thank you Greg Hewgill i will try to put the text file in the root directory of the project and post a screen.
You were spot on Greg, i put the file in the root of the project instead of the exe directory (this always worked on Visual Studio). Now i got a different kind of error, which is great because i solved the main error. prntscr.com/h73u5
0

This

finput=fopen(arguments[counter], "r"); 

Will only fail if you do not supply correct filenames (e.g. if there are non-ASCII characters in the names or the names do not include the correct path, fopen() opens files in the current directory if no path is specified in the file name).

This

output_filename=(char*)malloc(sizeof(arguments[counter])); 

most likely does not allocate enough space for a name because arguments[counter] is a pointer, and sizeof() of a pointer is not the same as strlen(that_same_pointer) + 1.

This

output_filename=output_file_prefix; 

loses the just allocated memory because you are reassigning the pointer output_filename to point to some other place, output_file_prefix ("output_").

After the above this

strcat(output_filename, arguments[counter]); 

is likely going to crash your program because this is going to attempt to overwrite a string literal ("output_"), doing which causes undefined behavior per the C standard.

You have to allocate enough cumulative space for the strings that you want to concatenate and you have to concatenate them in the allocated space.

To save you even more trouble, here's another problem:

finput=fopen(arguments[counter], "r"); ... while(!feof(finput)) 

feof() only works after at least one read from a file. This has been asked ans answered multiple times.

4 Comments

Thank you sir, i will correct those mistakes. However, the program should still perform fopen. Here's a screenshot that proves i used correct filenames and directories. prntscr.com/h71pa
Do NOT keep changing the code in the question. Append newer versions, but don't change the original one because if you keep changing it, answering the question becomes pointless, because it changes!
It's a large chunk of code to append like 5 newer versions for each simple change, and I think these changes shouldn't affect the main problem at all.
Thank you for your time Alexey Frunze, the question is solved.
0

Try changing

for(counter=1; counter<n; ++n) { 

to

for(counter=1; counter<n; ++counter) 

It appears the code loops infinitely, therefore it would exhaust the possible elements in your argument array causing a NULL pointer to be returned.

5 Comments

I think you solved the problem Sir, thankyou for the feedback. I will test it now but it appears that it was such a silly mistake in the end
I changed it and still Unable to open, i think i'm doing something terribly wrong. I will edit with the code + your fix. I did rebuild the exe.
Try changing ++counter to counter++ instead.
ok, thank you annoying_squid. I'll add all edits to main thread.
Thank you for your time annoying_squid, the question is solved.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.