Most of the people write this in their code.
What dose it mean?
what is the use of #ifndef
.
#ifndef ONLINE_JUDGE
freopen("E://ADpan//in.in", "r", stdin);
freopen("E://ADpan//out.out", "w", stdout);
#endif
Most of the people write this in their code.
What dose it mean?
what is the use of #ifndef
.
#ifndef ONLINE_JUDGE
freopen("E://ADpan//in.in", "r", stdin);
freopen("E://ADpan//out.out", "w", stdout);
#endif
A cursory google search led to this post. To summarize: there are online coding competitions where predefined input is sent to stdin
and expected on stdout
. When testing and developing locally, some people prefer to hack their program to read from files instead, so they do not have to do something like
test_program < input | diff - expected_output
Finally, the ONLINE_JUDGE
macro is defined in the competition environment, so that uses stdin
/stdout
, while a local compilation will not have that macro and thus read from those files.
This line of code is used by competitive programmers who code in a text editor instead of an an IDE. By default the ONLINE_JUDGE constant is defined when submitting code in most online judges ex: codeforces or codechef. It helps the code to determine whether the code is being run on an online judge or on a local system machine. This line of code is used for the code to read & write from a file rather than stdin when running on a local machine as well as reading & writing from stdin and stdout, respectively when run in an online judge.
As a competitive programmer, this is something I use a lot. This means that during testing and implementation, you can do specific things - in this case, you are reading stdin
and stdout
from files to make debugging easier. When the code is compiled online and submitted, the ONLINE_JUDGE
flag is set so that this doesn't run and they can use specific files to validate your program.
Regarding the first part of your question about freopen()
:
In competitive programming, many contests request input and output from standard input/output. However, some problems (for example, many of the USACO problems) require you to read and write from a file. The freopen()
command is defined in the <stdio.h>
header file and allows you to redirect the input/output streams to files. You can choose to read or write to a file, along with some other ways to manipulate the file like append. The documentation can be found here.
In order to answer the second part of your problem "what is #ifndef", you need to know a few things:
#include "filename"
directive is replaced by the textual contents of the file. Files can include each other, for example, "Person1.h" can include "Person2.h" and vice versa.Now, to answer your question:
#ifndef
is a preprocessor directive which stands for "if not defined" that is always paired with #define
and #endif
and usually acts as an include guard. This prevents situations where files include each other infinitely, or each define the same class/function twice, both of which will cause errors. For example:
//file "person1.h"
#include "person2.h"
#ifndef PERSON1_H
#define PERSON1_H
class Person {
int age;
};
#endif
//file "person2.h"
#include "person1.h"
#ifndef PERSON2_H
#define PERSON2_H
class Person {
int age;
};
#endif
If you didn't put #ifndef in the files above, then person1.h would replace the first line with the textual contents of person2.h, but notice that person2.h also has an #include person1.h which would create an infinite loop. In addition, you would also have the Person class defined twice, which is illegal.