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

файлы, чтение запись идет не так как нужно - C++

Восстановить пароль Регистрация
 
Крюгер
 Аватар для Крюгер
0 / 60 / 3
Регистрация: 16.11.2012
Сообщений: 409
Записей в блоге: 3
24.12.2013, 16:15     файлы, чтение запись идет не так как нужно #1
и так, мне очень нужна ваша помощь! в кратце эта программа считывает файл в буфер, потом сравнивает 1 значение из буфера, и если оно подходит изменяет на нужное.
и вобщем всё бы хорошо, даже справляется с поставленой задачей но есть одно НО.

если я выбираю пункт заменить допустим все "0" в 11 столбце, то всё отлично заменяется,
но если я изменяю другое число, например 5, эм... на 32, то на выходе я получаю кашу.
жуткого качества.

в чем проблема -хз, вроде бы всё правильно.

(код в плохом виде , т.к на скорую руку)

что считывается:
Код
wpn_revolver.dds
0 -0.003498 0.041957 0.022500 0.000000 -1.000000 0.000000 0.535665 -0.301831 1 5 1.000000
0 0.002402 0.041957 0.022500 0.000000 -1.000000 0.000000 0.568365 -0.204401 1 5 1.000000
0 -0.000198 0.041957 0.022800 0.000000 -1.000000 0.000000 0.535665 -0.251108 1 5 1.000000
wpn_revolver.dds
0 -0.004598 0.041957 0.021400 0.000000 -1.000000 0.000000 0.568365 -0.348539 1 0 1.000000
0 -0.006098 0.041957 0.019500 0.000000 -1.000000 0.000000 0.628865 -0.384559 1 0 1.000000
0 -0.003498 0.041957 0.022500 0.000000 -1.000000 0.000000 0.535665 -0.301831 1 0 1.000000
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#include <iostream>
#include <windows.h>
 
#include <fstream>
#include <string>
#include <clocale>
#include <cstring>
#include <stdio.h>
 
using namespace std;
 
struct table
{
int dum;
float x,y,z;
float nx,ny,nz;
float u,v;
int dumm;
int idbone;
float weight;
};
 
 
int main()
{setlocale(LC_CTYPE, "Russian");
ifstream fin;
ofstream fout;
const int szbuf = 256;
const string txn = "wpn_revolver.dds";
char lbufer[szbuf];
char obufer[szbuf];
string wbufer;
int cline = 0;
table *ptable;
table *prtable;
int incr = 0;
int searchv;
int variablev;
 
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
COORD cor;
 cor.X = 0;
 cor.Y = 20;
 
 
fin.open("input.smd",std::ios::in);
if (!fin.is_open()){cout << "не удалось открыть файл.\n";}
while (!fin.eof())
{char c;
fin.get(c);
if (c == '\n') cline++;}
cout <<"строк в файле:"<<cline<<"\n";
fin.close();
 
fin.open("input.smd",std::ios::in);
ptable = new table[cline]; //---------------буфер структурированного файла
prtable = new table[cline]; //--------------буфер для записи корректированых данных
 
while (!fin.eof()){
 
 fin.getline(lbufer, szbuf);
 //wbufer=lbufer;
 
 //if (wbufer==txn){continue;
 //}else{
 sscanf( &lbufer[0], "%d %f %f %f %f %f %f %f %f %d %d %f" , &ptable[incr].dum, &ptable[incr].x, &ptable[incr].y,
 &ptable[incr].z, &ptable[incr].nx, &ptable[incr].ny, &ptable[incr].nz, &ptable[incr].u, &ptable[incr].v,
 &ptable[incr].dumm, &ptable[incr].idbone, &ptable[incr].weight);
 
incr++;
/*
printf("%d %f %f %f %f %f %f %f %f %d %d %f" , ptable[1].dum, ptable[1].x, ptable[1].y,
 ptable[1].z, ptable[1].nx, ptable[1].ny, ptable[1].nz, ptable[1].u, ptable[1].v,
 ptable[1].dumm, ptable[1].idbone, ptable[1].weight);*/
 SetConsoleCursorPosition(hConsole,cor);
cout <<"read:"<<(float)incr/cline*100<<"% \b\n";
if (incr==cline){goto S;}
 }//}
 
S:{
 
 cout << "введите значение которое следует заменить:\n";
 cin >> searchv;
 cout << "введите значение на которое следует изменять:\n";
 cin>> variablev;
 
 cout <<"замена выполняется...\n";
 for(int q = 0; q<=cline; q++){
prtable[q].dum = ptable[q].dum;
prtable[q].x = ptable[q].x;
prtable[q].y = ptable[q].y;
prtable[q].z = ptable[q].z;
prtable[q].nx = ptable[q].nx;
prtable[q].ny = ptable[q].ny;
prtable[q].nz = ptable[q].nz;
prtable[q].u = ptable[q].u;
prtable[q].v = ptable[q].v;
prtable[q].dumm = ptable[q].dumm;
if(ptable[q].idbone==searchv){ prtable[q].idbone=0; prtable[q].idbone=variablev;}else{
 prtable[q].idbone=ptable[q].idbone;}
//prtable[q].idbone = ptable[q].idbone;
prtable[q].weight = ptable[q].weight;
 
SetConsoleCursorPosition(hConsole,cor);
cout <<"analise:"<<(float)q/cline*100<<"% \b\n";
 
if (q==cline){goto R;}}}
R:{
cout <<"замена успешно выполнена!\n";
cout <<"идет запись результатов...\n";
 
fout.open("output.smd",ios::out);
 
for(int w = 0; w<=cline; w++){
if(prtable[w].dum+prtable[w].x+prtable[w].y+
 prtable[w].z+prtable[w].nx+prtable[w].ny+prtable[w].nz+prtable[w].u+prtable[w].v,
 prtable[w].dumm+prtable[w].idbone+prtable[w].weight==variablev){
 sprintf(&obufer[0],"%s",txn.c_str());
 }else{
sprintf(&obufer[0],"%d %f %f %f %f %f %f %f %f %d %d %f",prtable[w].dum, prtable[w].x, prtable[w].y,
 prtable[w].z, prtable[w].nx, prtable[w].ny, prtable[w].nz, prtable[w].u, prtable[w].v,
 prtable[w].dumm, prtable[w].idbone, prtable[w].weight);}
 
fout << &obufer[0]<<endl;
SetConsoleCursorPosition(hConsole,cor);
cout <<"write:"<<(float)w/cline*100<<"% \b\n";
 
  }
cout <<"запись завершена\n";
fout.close();
delete [] ptable;
delete [] prtable;}
return 0;}

тестил на входе всё норм считывается, значит где то на выходе беда,
видимо условие не срабатывает :
C++
1
2
3
4
5
if(prtable[w].dum+prtable[w].x+prtable[w].y+
 prtable[w].z+prtable[w].nx+prtable[w].ny+prtable[w].nz+prtable[w].u+prtable[w].v,
 prtable[w].dumm+prtable[w].idbone+prtable[w].weight==variablev){
 sprintf(&obufer[0],"%s",txn.c_str());
 }
хотя так то должно.
оно задумано чтобы срабатывало когда сумма всех значение полей равна заменяемому,
т.к при считывании вот этого ->wpn_revolver.dds
функция по всем параметрам вернет 0, то есть строка из 12 нулей,
а при поиске и замене их сумма станет равной заменяемому значению

Добавлено через 36 минут
да блин, шо в тему никто даже не заходит. я понимаю , что конечно многа букафф, но блин прога очень нужна, помогите кто может чтоль.

Добавлено через 31 минуту
такие все,отзывчивые... еще 100 лет, и на мою скромную тему полюбому ответят!

Добавлено через 1 час 0 минут
эту статью посмотрели уже ~40 человек...
похоже она получилась заведомо мертвой, так как многа букафф...

Добавлено через 14 часов 12 минут
спустя день никто не решился отписатьса по програмке

Добавлено через 2 часа 7 минут
почему происходит эта проблема я выяснил, незнаю даже как сразу этого незаметил, суть её заключается в том что при поиске нулевых значений нули естессно находятся, а потому проверка (второй фрагмент кода)
выполняется, в иных случаях проверка не срабатывает.

Всем спасибо за помощь!
осталось решить только как выйти из этой ситуации и всё ОК! да да программе ЖИТЬ
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.12.2013, 16:15     файлы, чтение запись идет не так как нужно
Посмотрите здесь:

Чтение и запись в текстовые файлы. C++
двоичные файлы,чтение\запись C++
Бинарные файлы, чтение и запись C++
Запись и чтение, файлы C++
fwrite\fread: чтение и запись в бинарные файлы C++
C++ Длинная арифметика(чтение и запись в файлы)
C++ Файлы (чтение/запись)
[Файлы] Запись-чтение-запись. Почему не прокатывает? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему

Метки
ввод вывод, неправильный вывод, файлы
Опции темы

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