• 0

[C++] Close All Open Streams


Question

Is there a way in C++ to close all open streams without directly referencing the stream:

e.g. filestream.close();

I ask because I have a program where one of my file streams in not in scope when I call exit(-1) to terminate my program. The file stream is a member of a class and I would like to avoid having to pass around another reference to the class. Anyway to do something like:

cin:streams.close();

???

Lastly, does it even matter if I close it, or will it get closed by destructors when I call exit(-1)? Thanks

Link to comment
https://www.neowin.net/forum/topic/620937-c-close-all-open-streams/
Share on other sites

9 answers to this question

Recommended Posts

  • 0

If you're using gcc or STLport, it is automatically closed. From the gcc-3.4.5 (MinGW) header:

	  /**
	   *  @brief  The destructor closes the file first.
	  */
	  virtual
	  ~basic_filebuf()
	  { this->close(); }

You might look into your header files to determine the answer. That was found in the fstream header, so the code for the destructor might be in the same header.

  • 0
  rpgfan said:
If you're using gcc or STLport, it is automatically closed. From the gcc-3.4.5 (MinGW) header:

	  /**
	   *  @brief  The destructor closes the file first.
	  */
	  virtual
	  ~basic_filebuf()
	  { this->close(); }

You might look into your header files to determine the answer. That was found in the fstream header, so the code for the destructor might be in the same header.

But a destructor gets called when you either delete or go out of scope. Calling exit() does neither, it bypasses any C++ exit code that gets run when your program (main()) goes out of scope.

You can try it with the following code:

#include <stdlib.h>

#include <iostream>

class MyTest {
public:
	MyTest() { std::cout << "Constructor" << std::endl; }
	~MyTest() { std::cout << "Destructor" << std::endl; }
};

int main() {
	MyTest test;

	exit(-1);

	return 0;
}

First run without the exit(-1), then with and you'll see the difference. Basically, don't use exit() in C++.

  • 0

If I don't use exit(-1) to kill the program, is there some safer alternative that won't require exceptions or passing around a lot of extra variables?

Here's what I'm trying to do:

//Generic error message thrower and application exiter
void stopWithError(string s)
{
	cout << "ERROR: " << s << endl << "Terminating Parser.";
	Tokenizer *t = Tokenizer::Instance();  //Instance returns a Singleton, so this is good
	t->closeInput();
	//I have a ParseTree class that also has closeInput() function
	//, however, it doesn't use the Singleton
	//pattern, so I can't easily get a reference to the ParseTree class
	// -- and I call this function
	//from many different places.
	//I want to be able to do these 2 lines as well, but am not sure how to w/o passing
	//the parsetree object around all the time.  Is there any other way?
	//	 parsetree->closeInput();
	//	 delete parsetree;
	exit(1);
}

  • 0

You could make it so that each instance of your class adds an instance of the stream to a static vector. You could then add a static function that loops through the vector and closes everything.

Using a setjmp/longjmp back to main() (so that you could return and run all the destructors) would probably be an option as well.

  • 0
  itsnotabigtruck said:
You could make it so that each instance of your class adds an instance of the stream to a static vector. You could then add a static function that loops through the vector and closes everything.

I was thinking the same thing. Have a singleton with a factory method to allocate your streams and keep track of them, and a have a closeAll to close all your streams or a close method to close individual ones.

As for using setjmp/longjmp, avoid it for the same reason as exit(). You'll bypass destructors that get called when your functions go out of scope.

OP: Are you by any chance writing a compiler (I am)? If so, you could probably restructure your code to avoid all this hassle. Also, if you're catching and report errors in parsing and then quitting, it's better to try and recover from parsing errors than just quitting.

  • 0

Thanks for the static vector idea - I'll probably go with that due to my class deadline.

I am in fact writing an interpreter (not a compiler) for a made up language (oh boy). I'm very interested in the code restructuring idea. Can you explain what the general idea would be? Also, what are some general techniques for recovering from parsing errors without quitting? Do you have to be looser with your language grammar? Thanks.

This topic is now closed to further replies.
  • Recently Browsing   0 members

    • No registered users viewing this page.
  • Posts

    • yeah GSMA began working to enable end to end encryption between android and iphone last year and apparently a new standard was developed. apple has said that they would implement this in "future software updates" but i haven't heard anything since march, the time this was all reported on. shortly after, i read on forbes that the FBI suggests not sending texts between iphone and android because they're unencrypted. i use signal to chat with my wife but i'd rather just use messages tbh (she has an iphone), i'm not really a 3rd party guy haha
    • Well, I did not like the trailer for the project he went to work on also, but why do you think he should waste time with this… did you love the season 2? Maybe I am missing out after the crap I saw in first season ep1-3? I love the first last of us game… while not the BEST it was one of the games that I will remember for the EXPERIENCE it game me… last of us 2 was not on the same level at all and the show🤔 complete miss in my experience of the first few level
    • They're likely moving all resources to other things. Clearly Windows is not important to them.
    • Image Uploader 1.4.3 Build 5352 by Razvan Serea Image Uploader is a free and open-source program for Windows that that allows you to effortlessly upload images, screenshots, and various files to a wide array of hosting services. With its capability to capture selected screen areas, it promptly uploads content to image hosting services, while also offering the convenience of automatically copying the URL to your clipboard. Key Features of Image Uploader: Upload to Multiple Hosting Services Image Uploader supports uploading images and files to over 30 popular hosting services. Additionally, it can upload directly to your own FTP, SFTP, or WebDAV server. After upload, the tool automatically generates sharing codes in HTML, BBCode, and Markdown, with support for custom output templates tailored to your needs. Video Frame Grabbing and Screenshot Tools You can extract multiple frames from video files in a wide range of formats including AVI, MP4, MKV, WMV, and more. It supports both system-installed codecs and built-in ones. The extracted frames can be uploaded individually or compiled into a single mosaic image. It also includes screenshot capabilities for the full screen or selected regions, along with a simple image editor for annotations, highlights, and blurring. Advanced Integration and Usability Image Uploader supports drag-and-drop, clipboard monitoring, and can be accessed via Windows Explorer’s context menu. It also features URL shortening, multi-account support, reuploading, and the ability to upload images embedded in text while retaining formatting. The app is available in several languages, including English, Russian, Turkish, Korean, Arabic, and more. Image Uploader 1.4.3 Build 5352 changelog: New Features Screen Recording: Added two powerful capture methods: DirectX (Desktop Duplication API) FFmpeg-based recording Expanded Hosting Services: Added support for new file hosting platforms: TeleBox (linkbox.to) take-me-to.space ranoz.gg webshare.cz lobfile.com imgpx.com freeimghost.net radikal.cloud anonpic.org fotozavr.ru imgtr.ee thumbsnap.com 8upload.com filemail.com Others Video Uploads: Added Flickr.com support for video uploads Localization: New French translation added Context Menu: Added "File Information" option to video file context menus DPI Support: Improved support for: Screen DPI changes Mixed-DPI multi-monitor setups Improvements Disabled application window animations during screenshot/screen recording initiation Updated API and documentation Improved overall stability Bug Fixes Fixed network client error that could cause application crashes Resolved unauthorized startup registration issue Fixed upload functionality for pixeldrain.com Restored tray icon balloon notifications visibility Various minor bug fixes Download: Image Uploader 64-bit | Portable 64-bit | ~16.0 MB | (Open Source) Download: Image Uploader 32-bit | Portable 32-bit | ~15.0 MB Download: Image Uploader ARM64 | Portable ARM64 | ~11.0 MB Links: Image Uploader Home Page | Screenshot | GitHub Get alerted to all of our Software updates on Twitter at @NeowinSoftware
    • A new Forza was among the things specifically mentioned as 'next year' during the Showcase in June. That's more than likely Horizon 6. Turn 10 made Motorsport and is responsible for the engine behind Horizon and the Fable reboot (with adjustments for each, of course). I think they'll likely remain a support studio for Playground. Given the fact that Turn 10's staff has been halved, and how much of a fumble the launch of Motorsport was (which remember, they initially branded as a 'platform' rather than just a standalone thing), the transition to support studio wouldn't surprise me.
  • Recent Achievements

    • Reacting Well
      SteveJaye earned a badge
      Reacting Well
    • One Month Later
      MadMung0 earned a badge
      One Month Later
    • One Month Later
      Uranus_enjoyer earned a badge
      One Month Later
    • Week One Done
      Philsl earned a badge
      Week One Done
    • Week One Done
      Jaclidio hoy earned a badge
      Week One Done
  • Popular Contributors

    1. 1
      +primortal
      431
    2. 2
      ATLien_0
      156
    3. 3
      +FloatingFatMan
      148
    4. 4
      Nick H.
      64
    5. 5
      +thexfile
      62
  • Tell a friend

    Love Neowin? Tell a friend!