C++ Tutorial/File Stream/file utilities
Содержание
- 1 A file comparision utility.
- 2 A simple file-comparison utility.
- 3 Check file status
- 4 Copying one file into another:
- 5 Count number of lines of all files passed as argument
- 6 Get file information: size, device, creation time and last modification time
- 7 Obtaining file size
- 8 Use ifstream and ofstream to copy file
A file comparision utility.
<source lang="cpp">#include <iostream>
- include <fstream>
using namespace std;
int main(int argc, char *argv[]) {
register int i; int numread; unsigned char buf1[1024], buf2[1024]; ifstream f1("file1", ios::in | ios::binary); if(!f1) { cout << "Cannot open first file.\n"; return 1; } ifstream f2("file2", ios::in | ios::binary); if(!f2) { cout << "Cannot open second file.\n"; return 1; } do { f1.read((char *) buf1, sizeof buf1); f2.read((char *) buf2, sizeof buf2); if(f1.gcount() != f2.gcount()) { cout << "Files are of differing sizes.\n"; f1.close(); f2.close(); return 0; } for(i=0; i<f1.gcount(); i++) { if(buf1[i] != buf2[i]) { cout << "Files differ.\n"; f1.close(); f2.close(); return 0; } } } while(!f1.eof() && !f2.eof()); cout << "Files are the same.\n"; f1.close(); f2.close(); return 0;
}</source>
Cannot open first file.
A simple file-comparison utility.
<source lang="cpp">#include <iostream>
- include <fstream>
using namespace std; int main(int argc, char *argv[]) {
bool equal = true; bool ferr = false; unsigned char buf1[1024], buf2[1024]; if(argc!=3) { cout << "Usage: compfiles <file1> <file2>\n"; return 1; } ifstream f1(argv[1], ios::in | ios::binary); if(!f1) { cout << "Cannot open " << argv[1] << endl; return 1; } ifstream f2(argv[2], ios::in | ios::binary); if(!f2) { cout << "Cannot open " << argv[2] << endl; f1.close(); if(!f1.good()) cout << "Error closing " << argv[1] << endl; return 1; } do { f1.read((char *) buf1, sizeof buf1); f2.read((char *) buf2, sizeof buf2); if(!f1.eof() && !f1.good()) { cout << "Error reading " << argv[1] << endl; ferr = true; break; } if(!f2.eof() && !f2.good()) { cout << "Error reading " << argv[2] << endl; ferr = true; break; } if(f1.gcount() != f2.gcount()) { cout << "Files are different lengths.\n"; equal = false; break; } for(int i=0; i < f1.gcount(); ++i) if(buf1[i] != buf2[i]) { cout << "Files differ.\n"; equal = false; break; } } while(!f1.eof() && !f2.eof() && equal); if(!ferr && equal) cout << "Files are the same.\n"; f1.clear(); f2.clear(); f1.close(); f2.close(); if(!f1.good() || !f2.good()) { cout << "Error closing files.\n"; return 1; } return 0;
}</source>
Check file status
<source lang="cpp">#include <iostream>
- include <fstream>
using namespace std; void checkstatus(ifstream &in); int main(int argc, char *argv[]) {
ifstream in("test.txt"); char c; while(in.get(c)) { checkstatus(in); } checkstatus(in); // check final status in.close(); return 0;
} void checkstatus(ifstream &in) {
ios::iostate i; i = in.rdstate(); if(i & ios::eofbit) cout << "EOF encountered\n"; else if(i & ios::failbit) cout << "Non-Fatal I/O error\n"; else if(i & ios::badbit) cout << "Fatal I/O error\n";
}</source>
EOF encountered
Copying one file into another:
<source lang="cpp">#include <iostream>
- include <fstream>
- include <cstdlib>
using namespace std; void print_error(const char*, const char* = " "); int main(int argc, char* argv[]) {
if (3 != argc) print_error("usage: copy source dest"); ifstream in( argv[1], ios::binary ); if (!in) print_error( "can"t open", argv[1] ); ofstream out( argv[2], ios::binary ); if (!out) print_error( "can"t open", argv[2] ); char ch; while ( in.get(ch) ) out.put( ch ); if ( !in.eof() ) print_error("something strange happened"); return 0;
} void print_error(const char* p, const char* p2) {
cerr << p << " " << p2 << "\n"; exit(1);
}</source>
Count number of lines of all files passed as argument
<source lang="cpp">/* The following code example is taken from the book
* "The C++ Standard Library - A Tutorial and Reference" * by Nicolai M. Josuttis, Addison-Wesley, 1999 * * (C) Copyright Nicolai M. Josuttis 1999. * Permission to copy, use, modify, sell and distribute this software * is granted provided this copyright notice appears in all copies. * This software is provided "as is" without express or implied * warranty, and with no claim as to its suitability for any purpose. */
- include <iterator>
- include <algorithm>
- include <fstream>
- include <iostream>
int countLines (std::istream& in); int main (int argc, char* argv[]) {
int count; if (argc == 1) { // no argument => count lines of standard input count = countLines(std::cin); } else { // count number of lines of all files passed as argument std::ifstream in; count = 0; for (int i=1; i<argc; ++i) { in.open(argv[i]); if (!in) { std::cerr << "failed to open " << argv[1] << "\n"; } else { count += countLines(in); in.close(); } } } std::cout << count << std::endl;
} int countLines (std::istream& in) {
return std::count(std::istreambuf_iterator<char>(in), std::istreambuf_iterator<char>(), "\n");
}</source>
asdf ^CTerminate batch job (Y/N)? n
Get file information: size, device, creation time and last modification time
<source lang="cpp">#include <iostream>
- include <ctime>
- include <sys/types.h>
- include <sys/stat.h>
- include <cerrno>
- include <cstring>
int main(int argc, char** argv ) {
struct stat fileInfo; if (stat("test.txt", &fileInfo) != 0) { // Use stat( ) to get the info std::cerr << "Error: " << strerror(errno) << "\n"; return(EXIT_FAILURE); } std::cout << "Type: : "; if ((fileInfo.st_mode & S_IFMT) == S_IFDIR) { // From sys/types.h std::cout << "Directory\n"; } else { std::cout << "File\n"; } std::cout << "Size : " << fileInfo.st_size << "\n"; // Size in bytes std::cout << "Device : " << (char)(fileInfo.st_dev + "A") << "\n"; // Device number std::cout << "Created : " << std::ctime(&fileInfo.st_ctime); // Creation time std::cout << "Modified : " << std::ctime(&fileInfo.st_mtime); // Last mod time
}</source>
Type: : File Size : 21 Device : C Created : Mon Apr 23 11:16:57 2007 Modified : Mon Apr 23 13:09:24 2007
Obtaining file size
<source lang="cpp">#include <iostream.h>
- include <fstream.h>
const char * filename = "test.txt"; int main () {
long l,m; ifstream file (filename, ios::in|ios::binary); l = file.tellg(); file.seekg (0, ios::end); m = file.tellg(); file.close(); cout << "size of " << filename; cout << " is " << (m-l) << " bytes.\n"; return 0;
}</source>
size of test.txt is 40 bytes.
Use ifstream and ofstream to copy file
<source lang="cpp">#include <iostream.h>
- include <fstream.H>
main(void) {
char ch; ifstream f1("test.txt"); ofstream f2("text1.txt"); if(!f1) cerr <<"Can"t open IN file\n"; if(!f2) cerr << "Can"t open OUT file\n"; while(f1 && f1.get(ch) ) f2.put(ch); return (0);
}</source>