2016-04-10 62 views
0

Ödevim birden fazla ikili dosyayı birleştirmek ve daha sonra bir txt dosyasına yerleştirmek, zaten dosya formatına sahip olmak, bunları zaten yazdım, ancak bunları birleştiremedim. Output from the binary file into the txt file.2 ikili dosyayı birleştirme. Dosyalar arasında kalan veriler

int merge_files() 
{ 
    FILE *f1, *ft; 
    char ch, name1[20]; 
    int error, n; 
    char buffer[10000]; 
    printf("\n Give name of file: "); gets_s(name1, 19); 
    while (strlen(name1) != NULL) 
    { 
     fopen_s(&f1, name1, "rb"); 
     fopen_s(&ft, "finaldata.dat", "a"); 
     if (!f1) 
     { 
      error = 1; 
      break; 
     } 
     else 
     { 
      error = 0; 

      rewind(f1); 

      while (n = fread(buffer, sizeof(char), 10000, f1)) 
      { 
       fwrite(buffer, sizeof(char), n, ft); 
       fflush(ft); 
      } 
     } 

     fclose(f1); 
     fclose(ft); 
     printf("Files had been merged"); 
     printf("\n Give name of file: "); gets_s(name1, 19); 
    } 

    return error; 
} 
+0

Kötü durumdayım, o zaman tamamen yanlış görünüyor ... MS sürümlerini daha yakından kontrol etmeliyim. –

+1

@ DavidC.Rankin Çalışmıyor, Visual Studio 2013 kullanıyorum, FILE * FILE ** –

+0

türünde bir parametre ile uyumlu değil Yanlış söyledim - Özür dilerim. "Fopen" ve "fopen_s" ın aynı parametreleri aldığını farz ettim. MS kullanmıyorum, bu yüzden whozcraig 'fopen_s' işaret ettiğinde aslında bir * işaretçi-işaretçi-FILE * istediğinde şaşırdım. Orijinalinize geri dönün ... –

cevap

0

Bu tutarlı değildir:

fopen_s(&f1, name1, "rb"); 
fopen_s(&ft, "finaldata.dat", "a"); 

işe olamazdı işletim sistemine bağlı olarak bu fonksiyondur. Varsayılan mod metin modudur, bu yüzden kaynak dosyayı ikili modda açar ve metin modunda dosyayı hedeflersiniz. İşletim sisteminiz Windows ise, ek karakterler alacaksınız.

fopen_s(&f1, name1, "rb"); 
fopen_s(&ft, "finaldata.dat", "ab"); // both files in binary mode 

Edit: Sadece bu şekilde yaparsak kontrol orada hiçbir utf-8 herhangi bir dosya dizisi ile başlıyorsa BOM aşağıdaki programa

#include <stdio.h> 

#define BOM_SIZE 3 

int main(int argc, char *argv[]) 
{ 
    int err = 0; 

    for (int i = 1; i < argc; i++) { 
     FILE *f = fopen (argv[i], "r"); 
     if (f != NULL) { 
      unsigned char buf[BOM_SIZE]; 
      if (fread(buf, sizeof(char), BOM_SIZE, f) == BOM_SIZE) 
      { 
       printf("File %s starts with:\n", argv[1]); 

       for (int j = 0; j < BOM_SIZE; j++) 
       { 
        printf("0x%02x%s", (unsigned int) buf[j], (j < BOM_SIZE - 1) ? ", " : "\n"); 
       } 
      } 
      else if (ferror(f)) 
      { 
       perror("fread"); 
       fprintf(stderr, "Error reading file %s\n.", argv[1]); 
       err = 1; 
      } 
      else 
      { 
       printf("File %s is too short to have a UTF-8 BOM.\n", argv[1]); 
      } 
      fclose(f); 
     } 
     else 
     { 
      perror("fopen"); 
      fprintf(stderr, "Could not open %s.\n", argv[i]); 
      err = 1; 
     } 
    } 

    return err; 
} 

ile giriş dosyalarında "0xef, 0xbb, 0xbf" O zaman bir utf-8 bombası var!

+0

Hala çalışmıyor, ek karakterler ekliyor. –

+0

@ sNow11 Hatalarınızı içeren basit dosyalar sağlayabiliyor musunuz? Onu yeniden üretemiyorum. – jdarthenay

+0

Bu oldukça hassas bir problem, yapacağım her şey, herhangi bir fonksiyon, her bir birleştirilmiş dosyadan sonra karakter ekliyor gibi görünüyor. Neden bilmiyorum. Bu arada, işlevi tamamen değiştirdim ve hala çalışmıyor. Bulmayı başarabilirsem cevabı burada yayınlayacağım. Cevaplar için teşekkürler! –