2012-07-19 18 views
8

Bir dizi veri dosyasını okutan ve bazı model hesaplamaları yapan bir uygulamam var. aşağıda gösterildiği gibi program verileri dosyalarının kendilerini değiştirmek gerekmez, bu yüzden şu anda salt okunur bayrağıyla onları açıyorum:Birden çok programın aynı dosyadan aynı anda okunmasına izin verebilir miyim?

FILE* file; 
if(_wfopen_s(&file, fname.c_str(), L"r") == 0) 
... 

aynı çalışan benim programın birkaç istiyorum Aynı veri kümesini kullanarak, ancak veriler üzerinde farklı hesaplamalar yaparak zaman. Programlarımın hiçbiri veri dosyalarını değiştirmemelidir. Veri dosyaları çok büyük olduğundan, her programla kullanılacak verilerin ayrı kopyalarını oluşturamıyorum.

Bunun nedeni, dosyaları salt okunur izinlerle açtığım için, iki programın aynı anda aynı dosyadan okunabileceğini varsaydım. Bunun yerine, "başka bir işlem tarafından kullanıldığından dosya açılamadı" satırlarında çeşitli hatalar alıyorum.

Benim geliştirme ortamım Windows 7, this question suggests it might be a matter of enabling read sharing. Ancak, bu iş parçacığının tüm yanıtları CreateFile güveniyor, ben stdio.h ile yazılmış eski kod ile uğraşıyorum.

Fopen işlev sınıflarını kullanarak bir dosyadan eşzamanlı olarak okunan birkaç programa sahip olduğum bir yol var mı?

+0

Bence CreateFile() işlevini kullanmanın başka bir yolu yoktur. Soru, bir HANDLE’dan nasıl bir FILE * elde edilebileceğidir. – Paranaix

+1

std :: ifstream'i de kullanabilirsiniz .. tüm bunlar C++ olarak etiketlendikten sonra? – stijn

+0

@Paranaix: '_open_osfhandle' ve sonra' _fdopen'. – MSalters

cevap

6

fopen rutinini değiştirdiyseniz, paylaşılan okuma/yazma için _fsopen numaralı çağrılarını değiştirmeyi deneyin. _fsopen mscrt özgüdür.

Eğer CreateFile kullanabilir ve yazma/okuma için tüm eski kodu yeniden yazmak için istemiyorsanız, ayrıca bir winapi dosya saplı bir FILE * ilişkilendirerek deneyebilirsiniz. CreateFile tarafından döndürülen bir dosya tanıtıcısından bir dosya tanıtıcısı almak için _open_osfhandle'u kullanın, daha sonra bu dosya tanıtıcısından bir FILE * almak için _fdopen kullanın.

İlgili konular