It’s surprisingly difficult to make this determination reliably and portably. Any test you make can be invalidated if the file is created or deleted (i.e. by some other process) between the time you make the test and the time you try to open the file.
Three possible test functions are stat, access, and fopen. (To make an approximate test using fopen, just open for reading and close immediately, although failure does not necessarily indicate nonexistence.) Of these, only fopen is widely portable, and access, where it exists, must be used carefully if the program uses the Unix set-UID feature. (If you have the choice, the best compromise is probably one of the stat functions.)
Rather than trying to predict in advance whether an operation such as opening a file will succeed, it’s often better to try it, check the return value, and complain if it fails. (Obviously, this approach won’t work if you’re trying to avoid overwriting an existing file, unless you’ve got something like the O_EXCL file opening option available, which does just what you want in this case.)