Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
3 / 3 / 0
Регистрация: 20.05.2010
Сообщений: 50

БредоTCHAR C++

24.05.2010, 19:05. Показов 911. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, уважаемые программисты. Дело вот в чем: написал я простенькую функцию, которая копирует 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
объясните, пожалуйста. как пофиксить это.
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
24.05.2010, 19:49
Кареточку на начало файла верните

Добавлено через 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;
}
0
3 / 3 / 0
Регистрация: 20.05.2010
Сообщений: 50
25.05.2010, 20:19  [ТС]
Срасибо, что показали работу дотоле незнакомых функций(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, все ок. Как так получается?
Code
1
2
fread(buf,sizeof(char),tmp+1,f_i);
fwrite(buf,tmp-1,sizeof(char),f_o);
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
26.05.2010, 00:10
странно, а у меня работает:
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. Только такого ведь все равно не должно быть, не понимаю в чем дело
0
302 / 160 / 62
Регистрация: 27.02.2010
Сообщений: 317
26.05.2010, 11:25
Если вывести на печать sizeof TCHAR и char, то первый в 2 раза больше второго, следовательно, он выводит вам количество символов в 2 раза больше, чем надо... наверное, действительно в этом проблема
0
3 / 3 / 0
Регистрация: 20.05.2010
Сообщений: 50
26.05.2010, 19:01  [ТС]
fread(pbuf, sizeof(TCHAR), filesize, fin);
fwrite(pbuf, sizeof(char), filesize, fout);
Обратите внимание, Вы используете в функции fwrite
Code
1
sizeof(char)
Таким образом у меня тоже работает. Только не могу понять, почему надо использовать
Code
1
sizeof(char)
вместо
Code
1
sizeof(TCHAR)
? Ведь массивчик то TCHAR'овский
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
26.05.2010, 22:57
Цитата Сообщение от Александр Елис Посмотреть сообщение
Обратите внимание, Вы используете в функции fwrite
да это я исправить забыл, проверял просто, у меня в обоих случаях работает.
а чем простите TCHAR отличается от char.
TCHAR - это либо char, либо w_char. Все зависит от настроек проекта, а если быть более точным, то от параметра _UNICODE
0
102 / 102 / 23
Регистрация: 12.05.2010
Сообщений: 232
26.05.2010, 23:19
Цитата Сообщение от Александр Елис Посмотреть сообщение
По-прежнему в новый файл копируется содержание старого + "ННННННННННННННННННННННННННННННННННН Н". C чем это связано? Может, дело в TCHAR, или я чего-то не понимаю? Пожалуйста, разъясните!
связано это с тем, что ты вылазишь за пределы массива, где-то у тебя не хватает символа завершения строки '\0' вот он дальше из оперативной памяти и пишет...
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
26.05.2010, 23:24
Цитата Сообщение от Mur3ik Посмотреть сообщение
связано это с тем, что ты вылазишь за пределы массива, где-то у тебя не хватает символа завершения строки '\0' вот он дальше из оперативной памяти и пишет...
вывод неформатированных данных используется, на нуль-терминатор должно быть побоку.

Попробуйте мой пример, только опечаточку исправьте, если не будет работать, значит что-то с настройками проекта может быть, если будет... то переписывайте свою функцию, может быть поможет. И оформляйте код посимпатичнее, а то читать же невозможно
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Ответ Создать тему
Новые блоги и статьи
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru