tags:

views:

374

answers:

5

Most of the languages like C++ when writing into a file, put an EOF character even if we miss to write statements like :

filestream.close

However is there any way, we can put the EOF character according to our requirement, in C++, for an instance. Or any other method we may use apart from using the functions provided in C++.

If you need to ask more of information then kindly do give a comment.

Thanks in advance.

EDIT: Thanks for your support but here's an addition to this question:

What if, we want to trick the OS and place an EOF character in a file and write some data after the EOF so that an application like notepad.exe is not able to read after our EOF character. I have read answers to the question related to this topic and have come to know that nowdays OS generally don't see for an EOF character rather check the length of file to get the correct idea of knowing about the length of the file but, there must be a procedure in OS which would be checking the length of file and then updating the file records.

I am sorry if I am wrong at any point in my estimation but please do help me coz it can lead to a lot of new ideas.

Thanks.

+2  A: 

If by the EOF character you mean something like Control-Z, then modern operating systems don't need such a thing, and the C++ runtime will not write one for you. You can of course write one yourself:

 filestream.put( 26 );     // write Ctrl-Z

but there is no good reason to do so. There is also no need to do:

 filesystem.close();

as the file stream will be closed for you automatically when its destructor is called, but it is (I think) good practice to do so.

anon
+12  A: 

There is no EOF character. EOF by definition "is unequal to any valid character code". Often it is -1. It is not written into the file at any point.

There is a historical EOF character value (CTRL+Z) in DOS, but it is obsolete these days.

To answer the follow-up question of Apoorv: The OS never uses the file data to determine file length (files are not 'null terminated' in any way). So you cannot trick the OS. Perhaps old, stupid programs won't read after CTRL+Z character. I wouldn't assume that any Windows application (even Notepad) would do that. My guess is that it would be easier to trick them with a null (\0) character.

ypnos
That is an EOF on read - we are talking about writing.
anon
I only explained what EOF actually is and that it is not a character code. I don't see your problem with the answer.
ypnos
+3  A: 

Actually in C++ there is no physical EOF character written to a file using either the fprintf() or ostream mechanisms. EOF is an I/O condition to indicate no more data to read.

Some early disk operating systems like CP/M actually did use a physical 0x1A (ASCII SUB character) to indicate EOF because the file system only maintained file size in blocks so you never knew exactly how long a file was in bytes. With the advent of storing actual length counts in the directory it is no longer typical to store an "EOF" character as part of the 'in-band' file data.

Amardeep
+5  A: 

Well, EOF is just a value returned by the function defined in the C stdio.h header file. Its actually returned to all the reading functions by the OS, so its system dependent. When OS reaches the end of file, it sends it to the function, which in its return value than places most commonly (-1), but not always. So, to summarize, EOF is not character, but constant returned by the OS. EDIT: Well, you need to know more about filesystem, look at this.

Hi, to your second question:

once again, you should look better into filesystems. FAT is very nice example, becouse you can find many articles about it, and its principles are very similiar to NTFS. Anyway, once again, EOF is NOT a character. You cannot place it in file directly. If you could do so, imagine the consequences, even "dumb" image file could not be read by the system.

Why? Becouse OS works like very complex structure of layers. One of the layer is the filesystem driver. It makes sure that it transfers data from every filesystem known to the driver. It provides bridge between applications and the actuall system of storing files into HDD.

To be exact, FAT filesystem uses so-called FAT table - it is a table located close to the start of the HDD (or partition) adress space, and it contains map of all clusters (little storage cells). OK, so now, when you want to save some file to the HDD, OS (filesystem driver) looks into FAT table, and searches for the value "0x0". This "0x0" value says to the OS that cluster which adress is described by the location of that value in FAT table is free to write.

So it writes into it the first part of the file. Than, it looks for another "0x0" value in FAT, and if found, it writes second part of the file into cluster which it points to. Than, it changes the value of the first FAT table record where the file is located to the physical adress of the next in our case second part of the file.

When your file is all stored on HDD, now there comes the final part, it writes desired EOF value, but into FAT table, not into the "data part" of the HDD. So when the file is read next time, it knows this is the end, don´t look any further.

So, now you see, if you would want to manually write EOF value into the place it doesen´t belong to, you have to write your own driver which would be able to rewrite the FAT record, but this is practically impossible to do for begginers.

B.Gen.Jack.O.Neill
great answer, this is more to my persuasion :)
Matt Joiner
Ok, thanks. I am just newcomer, still learning...
B.Gen.Jack.O.Neill
A: 

On modern filesystems EOF is not a character, so you don't have to issue it when finishing to write to a file. You just have to close the file or let the OS do it for you when your process terminates.

mouviciel