Форум программистов, компьютерный форум CyberForum.ru

БредоTCHAR C++ - C++

Восстановить пароль Регистрация
 
Александр Елис
3 / 3 / 1
Регистрация: 20.05.2010
Сообщений: 50
24.05.2010, 19:05     БредоTCHAR C++ #1
Здравствуйте, уважаемые программисты. Дело вот в чем: написал я простенькую функцию, которая копирует txt-файлы. Файлы на английским содержанием нормально работают. Но кириллица тупит... Немного переделал функцию, теперь исправно копирует кириллицу, но в конце добавляет бред

HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH HHHHHHHHHHHHHHHHHHHHH
Ниже привожу код функции:


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#ifndef _MYTXTFILECOPY_H_
#define _MYTXTFILECOPY_H_
 
 
#include "stdio.h"
#include "tchar.h"
#include <iostream>
using namespace std;
//=============================================================||
#define MAX_BUFFER_LENGHT 1000
#define fcopy MyTXTFileCopy 
 
bool MyTXTFileCopy(char* F_I, char *F_O)
{
    FILE *f_i;
    FILE *f_o;
    TCHAR *buf;
    //TCHAR buffer[MAX_BUFFER_LENGHT] = _TEXT("1\0");
    char c = ' ';
    int tmp = 0;
    //int count = 10000;
    //=====================||
    f_i=fopen(F_I,"r");
    if(f_i==NULL)
    {
        cout << "\nFunction \"read\" return false(cannot open the file?). " << "Name of file: " << F_I << "\n"; 
        return false;
    }
    while((c=fgetc(f_i))!=EOF)
    {
        //cout << c;
        tmp++;
    }
    //cout << tmp;
    if(tmp==0)
    {
        
        cout << "\nFunction MyTXTFileCopy return \"false\"(file is clear?).\n";
        return false;
    }
    fclose(f_i);
    f_i=fopen(F_I,"r");
    if(f_i==NULL)
    {
        cout << "\nFunction \"read\" return false(cannot open the file?). " << "Name of file: " << F_I << "\n"; 
        return false;
    }
    buf=new TCHAR[tmp+1];
    cout << buf;
    fread(buf,sizeof(TCHAR),tmp,f_i);
    cout << buf;
    f_o=fopen(F_O,"w");
    fwrite(buf,tmp-1,sizeof(TCHAR),f_o);
    fclose(f_i);
    fclose(f_o);
    return true;
}
#endif
объясните, пожалуйста. как пофиксить это.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
24.05.2010, 19:49     БредоTCHAR C++ #2
Кареточку на начало файла верните

Добавлено через 1 минуту
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
bool MyTXTFileCopy(char * inFileName, char * outFileName)
{
   // file descriptors
   FILE * inFile  = NULL;
   FILE * outFile = NULL;
 
   // open files
   if((inFile = fopen(inFileName, "rb")) == 0)
      perror("can't open file");
 
   if((outFile = fopen(outFileName, "wb")) == 0)
      perror("can't open file");
 
   if(inFile == NULL || outFile == NULL)
      return false;
 
   // initialize variables
   char   buffer[BUFSIZ];
   size_t fileSize = 0;
 
   // get file size
   fseek(inFile, 0, SEEK_END);
   fileSize = ftell(inFile);
   fseek(inFile, 0, SEEK_SET);
 
   // copying
   for(size_t i = 0; i < fileSize / BUFSIZ; ++i)
   {
      fread(buffer, 1, BUFSIZ, inFile);
      fwrite(buffer, 1, BUFSIZ, outFile);
   }
   if(fileSize)
   {
      fread(buffer, 1, fileSize % BUFSIZ, inFile);
      fwrite(buffer, 1, fileSize % BUFSIZ, outFile);
   }
 
   fclose(outFile);
   fclose(inFile);
 
   return true;
}
Александр Елис
3 / 3 / 1
Регистрация: 20.05.2010
Сообщений: 50
25.05.2010, 20:19  [ТС]     БредоTCHAR C++ #3
Срасибо, что показали работу дотоле незнакомых функций(fseek и т.д.), но каретка у меня на начале файла итак, т.к. я закрываю и вновь открываю файл.
Кроме того, я переделал свою функцию так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#ifndef _MYTXTFILECOPY_H_
#define _MYTXTFILECOPY_H_
 
 
#include "stdio.h"
#include "tchar.h"
#include <iostream>
using namespace std;
//=============================================================||
#define MAX_BUFFER_LENGHT 1000
#define fcopy MyTXTFileCopy 
 
bool MyTXTFileCopy(char* F_I, char *F_O)
{
    FILE *f_i;
    FILE *f_o;
    TCHAR *buf;
    //TCHAR buffer[MAX_BUFFER_LENGHT] = _TEXT("1\0");
    char c = ' ';
    int tmp = 0;
    //int count = 10000;
    //=====================||
    cout << F_I << "\n" << F_O; 
    f_i=fopen(F_I,"r");
    if(f_i==NULL)
    {
        cout << "\nFunction \"MyTXTFileCopy\" return false(cannot open the file?). " << "Name of file: " << F_I << "\n"; 
        return false;
    }
    fseek(f_i,0,SEEK_END);
    tmp=ftell(f_i);
    if(tmp==0)
    {
        cout << "\nFunction \"MyTXTFileCopy\" return false(File is clear?). " << "Name of file: " << F_I << "\n"; 
        return false;
    }
    fseek(f_i,0,SEEK_SET);
    buf=new TCHAR[tmp+1];
    //cout << buf;
    fread(buf,sizeof(TCHAR),tmp,f_i);
    for(int i=0;i<tmp+1;i++)
    {
        cout << buf[i];
    }
    f_o=fopen(F_O,"w");
    fwrite(buf,tmp-1,sizeof(TCHAR),f_o);
    fclose(f_i);
    fclose(f_o);
    return true;
}
#endif
, но проблема не исчезла. По-прежнему в новый файл копируется содержание старого + "НННННННННННННННННННННННННННННННННННН". C чем это связано? Может, дело в TCHAR, или я чего-то не понимаю? Пожалуйста, разъясните!
P.S. После fread в buf, если сделать cout << buf выдает страхобред(чиселки какие-то)

Добавлено через 54 минуты
О_о вот еще новость:
если меняю в функциях fread и fwrite TCHAR на char, все ок. Как так получается?
Код
fread(buf,sizeof(char),tmp+1,f_i);
fwrite(buf,tmp-1,sizeof(char),f_o);
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
26.05.2010, 00:10     БредоTCHAR C++ #4
странно, а у меня работает:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <tchar.h>
 
int main()
{
   // open files
   FILE * fin  = fopen("in.txt", "r");
   FILE * fout = fopen("out.txt", "w");
   // get file size
   fseek(fin, 0, SEEK_END);
   size_t filesize = ftell(fin);
   fseek(fin, 0, SEEK_SET);
   // buffer
   TCHAR * pbuf = new TCHAR[filesize];
   // read and write
   fread(pbuf, sizeof(TCHAR), filesize, fin);
   fwrite(pbuf, sizeof(char), filesize, fout);
   // close files
   fclose(fin);
   fclose(fout);
   // free
   delete[] pbuf;
}
in.txt 14 bytes
wwer hgwerh eg
out.txt 14 bytes
wwer hgwerh eg
обратите внимание, если размер выходного файла в два раза больше, то косяк с неопределенностью TCHAR, определяться ему как одно-байтовым ANSI символам, либо 2х-байтовым UNICODE. Только такого ведь все равно не должно быть, не понимаю в чем дело
NNN777
299 / 157 / 19
Регистрация: 27.02.2010
Сообщений: 317
26.05.2010, 11:25     БредоTCHAR C++ #5
Если вывести на печать sizeof TCHAR и char, то первый в 2 раза больше второго, следовательно, он выводит вам количество символов в 2 раза больше, чем надо... наверное, действительно в этом проблема
Александр Елис
3 / 3 / 1
Регистрация: 20.05.2010
Сообщений: 50
26.05.2010, 19:01  [ТС]     БредоTCHAR C++ #6
fread(pbuf, sizeof(TCHAR), filesize, fin);
fwrite(pbuf, sizeof(char), filesize, fout);
Обратите внимание, Вы используете в функции fwrite
Код
sizeof(char)
Таким образом у меня тоже работает. Только не могу понять, почему надо использовать
Код
sizeof(char)
вместо
Код
sizeof(TCHAR)
? Ведь массивчик то TCHAR'овский
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
26.05.2010, 22:57     БредоTCHAR C++ #7
Цитата Сообщение от Александр Елис Посмотреть сообщение
Обратите внимание, Вы используете в функции fwrite
да это я исправить забыл, проверял просто, у меня в обоих случаях работает.
а чем простите TCHAR отличается от char.
TCHAR - это либо char, либо w_char. Все зависит от настроек проекта, а если быть более точным, то от параметра _UNICODE
Mur3ik
102 / 102 / 4
Регистрация: 12.05.2010
Сообщений: 232
26.05.2010, 23:19     БредоTCHAR C++ #8
Цитата Сообщение от Александр Елис Посмотреть сообщение
По-прежнему в новый файл копируется содержание старого + "НННННННННННННННННННННННННННННННННННН". C чем это связано? Может, дело в TCHAR, или я чего-то не понимаю? Пожалуйста, разъясните!
связано это с тем, что ты вылазишь за пределы массива, где-то у тебя не хватает символа завершения строки '\0' вот он дальше из оперативной памяти и пишет...
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
26.05.2010, 23:24     БредоTCHAR C++ #9
Цитата Сообщение от Mur3ik Посмотреть сообщение
связано это с тем, что ты вылазишь за пределы массива, где-то у тебя не хватает символа завершения строки '\0' вот он дальше из оперативной памяти и пишет...
вывод неформатированных данных используется, на нуль-терминатор должно быть побоку.

Попробуйте мой пример, только опечаточку исправьте, если не будет работать, значит что-то с настройками проекта может быть, если будет... то переписывайте свою функцию, может быть поможет. И оформляйте код посимпатичнее, а то читать же невозможно
Yandex
Объявления
26.05.2010, 23:24     БредоTCHAR C++
Ответ Создать тему
Опции темы

Текущее время: 16:24. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru