Gå til innhold

fstream write() lager bare en tom fil(vc++2008)[løst]


Anbefalte innlegg

Holder på med et lite prosjekt som involverer libcurl, programmet laster ned filer fra nettet og lagrer dem på disk. Programmet fungerer glimrende komplilert med gcc-4.3.1 under linux, men så skal jeg jo ha det til å fungere under windows også(for å gjøre det litt mere interessant Visual C++ 2008).

Programmet kompilerer fint(etter endel knot med curllib) og kjører egentlig veldig fint også, problemet er bare at jeg får filer(med rett filnanv) som er 0 bytes store...

Har snekra sammen et lite eksempelprogram med saveFile(...) funksjonen min, som illustrerer problemet.

Hadde satt pris på noen hint om hva ialledager jeg må gjøre for å få windows til å forstå at ting skal inn i filen :p

 

 

 

// testingapp.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <string>
#include <fstream>
#include <iostream>

void saveFile(const std::string data, const std::string &filename);

int _tmain(int argc, _TCHAR* argv[])
{
std::string hepp(400,'å');
saveFile(hepp, "test.txt");
return 0;
}

void saveFile(const std::string data, const std::string &filename)
{
std::fstream myfile;
size_t lastslash = filename.rfind("/")+1;
std::string fn = filename.substr(lastslash, std::string::npos);

for(int i = 0; i != 10; ++i)
{
	myfile.open(fn.c_str(), std::ios::in| std::ios::binary);
	if(myfile.is_open())
		fn += "-1";
	else
		break;
	myfile.close();
}
myfile.open (fn.c_str(), std::ios::out | std::ios::binary);
if(myfile.is_open())
{
	std::cout << data.size() << "\n";
	myfile.write(data.c_str(), data.size());
	myfile.close();
}
else
	std::cout << "Failed to open file for writing...\n";
}

 

 

 

EDIT: Løst, i windows må man kjøre clear() på fstreamen etter og ha prøvd å åpne en ikke-eksisterende fil.

Endret av Caps_Lock_kf
Lenke til kommentar
Videoannonse
Annonse
void saveFile(const std::string data, const std::string &filename)
{
std::fstream myfile;
size_t lastslash = filename.rfind("/")+1;
std::string fn = filename.substr(lastslash, std::string::npos);

for(int i = 0; i != 10; ++i)
{
	myfile.open(fn.c_str(), std::ios::in| std::ios::binary);
	if(myfile.is_open())
		fn += "-1";
	else
		break;
	myfile.close();
}

 

EDIT: Løst, i windows må man kjøre clear() på fstreamen etter og ha prøvd å åpne en ikke-eksisterende fil.

 

Egentlig ikke bare i windows. Når open()-kallet feiler, settes ios_base::failbit. Så lenge det bitet er satt, vil ingen av I/O-operasjonene lykkes. Det andre kallet på open() (på en ikke-eksisterende fil) vil lykkes, men siden failbit fortsatt er satt, vil påfølgende write()-operasjonen feile. Det enkleste er, som du fant ut, å bruke clear(). Ellers kan det være en god ide å sjekke stream state heller enn hvorvidt en stream er åpen:

 

	myfile.open (fn.c_str(), std::ios::out | std::ios::binary);
if ( myfile ) // ... success!

Lenke til kommentar

Tja, gcc 4.3.1 ga seg enentlig beng i å blokkere write, derfor jeg stussa litt på hvorfor det ikke fungerte i vc++. Er vel det som er det morsomme med cross platform programming, litt forskjellig implementasjon gjør at ting fort blir litt stress :p

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...