CoolBeer Skrevet 6. juni 2009 Del Skrevet 6. juni 2009 (endret) 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 // 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 6. juni 2009 av Caps_Lock_kf Lenke til kommentar
zotbar1234 Skrevet 6. juni 2009 Del Skrevet 6. juni 2009 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
CoolBeer Skrevet 7. juni 2009 Forfatter Del Skrevet 7. juni 2009 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 Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå