Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > запись и удаление из файла с++


Автор: Forxi358 10.2.2016, 17:48
помогите пожалуйста... почему у меня не правильно работает программа
Код

#define _CRT_SECURE_NO_WARNINGS 
#include <fstream> 
#include<string.h> 
#include<cstdio> 
#include <stdio.h> 
#include <iostream> 
using namespace std; 


struct avto 
{ 
char mark[20], color[20],cost[34]; 

int god; 
}; 


int main() 

{ 
FILE *f; 
FILE *f2; 
setlocale(LC_ALL, "Russian"); 
int kol; 
avto *S; 
cout <<"Vvedite kolichestvo avto \n"; 
cin >>kol; 
cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
S = new avto[kol]; 


f = fopen("D:\\file.txt", "w+"); 


ofstream von("D:\\file.txt", ios::out | ios::in); 



cout << "Vvod dannih \n"; 
for (int i = 0; i < kol; i++) 
{ 
cout << "\n mark : "; 
gets_s(S[i].mark); 
von<<"mark " <<S[i].mark << " "; 

cout <<" \n color: "; 
gets_s(S[i].color); 
von<< "color " <<S[i].color << " "; 

cout <<"\n cost : "; 
gets_s(S[i].cost); 
von << "cost " <<S[i].cost << " "; 


cout << "\n god : "; 
cin >> S[i].god; 

von <<"god " <<S[i].god <<endl; 
cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
} 
von.close(); 

f2 = fopen("temp.txt", "w+"); 
ofstream lol("temp.txt", ios::out | ios :: app); 

int g; 
cout << "Vvedite god "; 
cin >> g; 
for (long i = 0;i<kol;i++) 
if (S[i].god > g) 
{ 
lol <<"mark: "<< S[i].mark<<" color: " <<S[i].color<<" cost " <<S[i].cost << " god "<< S[i].god << endl; 
} 
fclose(f); 
fclose(f2); 
lol.close(); 
remove("file.txt"); 
rename("temp.txt", "file.txt"); 


system("pause"); 

return 0; 
}

задание такое
Структура "Автомобиль":
-    марка;
-    год выпуска;
-    цена;
-    цвет.    
Удалить все элементы, у которых год выпуска меньше заданного.( у меня не удаляется )
сначала записываем в файл структуру
потом открывает новый файл и  записываем в него  только то  у чего год выпуска больше заданного
но у меня почему-то все остается на месте(что записали то и осталось, т.е остался элемент у  у которых год выпуска меньше заданного)
    Добавить элемент с номером К(я не пойму как это сделать)
заранее спасибоо)


Автор: Михаил Марьясов 11.2.2016, 12:45
Вот мой упрощенный вариант
Код


#include <string>
#include <vector>
#include <fstream>

using namespace std;

struct avto
{
    string mark;
    string color;
    int cost;
    int god;
};

const char delimeter = ',';
const int year = 2000;

vector<string> split(const string& s, char c)
{
    vector<string> v;
    string::size_type i = 0;
    string::size_type j = s.find(c);

    while (j != string::npos) {
        v.push_back(s.substr(i, j - i));
        i = ++j;
        j = s.find(c, j);

        if (j == string::npos)
            v.push_back(s.substr(i, s.length()));
    }
    return v;
}


int main(int argc, char **argv)
{
    vector<avto> avtos;
    string line;
    ifstream myfile("d:\\file.txt");
    if (myfile.is_open())
    {
        while (myfile.good())
        {
            getline(myfile, line);
            vector<string>  v = split(line, delimeter);
            if (v.size() == 4)
            {
                avto a;
                a.mark = v[0];
                a.color = v[1];
                a.cost = stoi(v[2]);
                a.god = stoi(v[3]);
                avtos.push_back(a);
            }
        }
    }
    myfile.close();
    if (avtos.size() > 0)
    {
        ofstream ofile("d:\\outfile.txt");
        if (ofile.is_open())
        {
            for (size_t i = 0; i < avtos.size(); i++)
            {
                if (avtos[i].cost > year)
                {
                    ofile << avtos[i].mark << delimeter << avtos[i].color << delimeter << to_string(avtos[i].cost) << delimeter << to_string(avtos[i].god) << endl;
                }
            }
        }
        ofile.close();
    }
}



а это файл
toyete,blue,5600,1978
lada,green,15600,1998
pegeot,beliy,1800,2008
oka,black,600,2016


Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/zapis-i-udaleniye-iz-fayla-s-id56bb4e5bae2015de118b4568#findElement_E7045_56bc5828ae2015835e6e4bf0_0

Автор: xvr 11.2.2016, 16:37
Вот это зачем ?
Код

f = fopen("D:\\file.txt", "w+"); 
ofstream von("D:\\file.txt", ios::out | ios::in); 
Пишем в 2 ручья?  smile 
Одно из 2х лишнее.

И далее то же самое для 

Код

f2 = fopen("temp.txt", "w+"); 
ofstream lol("temp.txt", ios::out | ios :: app); 

Автор: Forxi358 11.2.2016, 23:33
Код

#include <iostream> 
#include <conio.h> 
#include <stdio.h> 
#include <stdlib.h> 
using namespace std; 
struct avto 
{ 
char mark[20]; 
char color[30]; 
int year; 
float cost; 
}; 

void main () 
{ 
clrscr (); 
avto p; 
FILE *f; 
f=fopen("D:\\f44.txt","w"); 

int n; 
printf("\n kol-?"); 
scanf("%d",&n); 
for (int i=0; i<n; i++) 
{ 
printf("\n mark: "); 
scanf("%s",&p.mark); 
printf("\n color: "); 
scanf("%s",&p.color); 
printf("\n Year: "); 
scanf("%d",&p.year); 
printf("\n Cost: "); 
scanf("%f",&p.cost); 

fwrite(&p,sizeof(avto),1,f); 
} 

fclose(f); 
f=fopen("D:\\f55.txt","r"); 
while(fread(&p,sizeof(avto),1,f)) 
{ 
printf("\n%s %s %d %f",p.mark,p.color,p.year,p.cost); 
} 
int yearmin; 
cout«"введите год"; 
cin»yearmin; 
if(p.year>yearmix) 
fwrite(&p,sizeof(avto),1,f); 
fclose(f); 
getch (); 
}
почему этот не работает?

Автор: xvr 12.2.2016, 13:44
Потому что вы все данные складываете в одну и туже переменную p, которую потом и выводите (причем не в текстовом виде, а в бинарном). Так что если вам повезет, то в выходном файле вы получите 1 запись (от последнего введенного автомобиля), а если не повезет - то получите пустой файл.

Автор: disputant 12.2.2016, 14:55
http://ru.stackoverflow.com/questions/491514/%D1%83%D0%B4%D0%B0%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B8%D0%B7-%D1%84%D0%B0%D0%B9%D0%BB%D0%B0-%D1%81

Автор: feodorv 13.2.2016, 00:45
Цитата(xvr @  12.2.2016,  13:44 Найти цитируемый пост)
Так что если вам повезет

Не повезёт:
Цитата(Forxi358 @  11.2.2016,  23:33 Найти цитируемый пост)
f=fopen("D:\\f55.txt","r"); 
...
fwrite(&p,sizeof(avto),1,f); 


Автор: Forxi358 14.2.2016, 13:58
Код

#include <iostream> 
#include <conio.h> 
#include <stdio.h> 
#include <stdlib.h> 
using namespace std; 
struct avto 
{ 
char mark[20]; 
char color[30]; 
int year; 
float cost; 
}; 
int main () 
{ 

avto p; 
FILE *f; 
f=fopen("D:\\f44.txt","w"); 
int n; 
printf("\n kol-?"); 
scanf("%d",&n); 
for (int i=0; i<n; i++) 
{ 
printf("\n mark: "); 
scanf("%s",&p.mark); 
printf("\n color: "); 
scanf("%s",&p.color); 
printf("\n Year: "); 
scanf("%d",&p.year); 
printf("\n Cost: "); 
scanf("%f",&p.cost); 
fwrite(&p,sizeof(avto),1,f); 
} 
fclose(f); 
f=fopen("D:\\f44.txt","r"); 
while(fread(&p,sizeof(avto),1,f)) 
{ 
printf("\n%s %s %d %f",p.mark,p.color,p.year,p.cost); 
} 
int yearmin; 
cout<<" vvod goda"; 
cin>>yearmin; 
if(p.year>yearmin) 
fwrite(&p,sizeof(avto),1,f); 
fclose(f);

int N;
cout<<"\nN vvod\n";
cin>>N;
f=fopen("D:\\f44.txt","a+"); 
for (int i=0; i<N; i++) 
{ 
printf("\n mark: "); 
scanf("%s",&p.mark); 
printf("\n color: "); 
scanf("%s",&p.color); 
printf("\n Year: "); 
scanf("%d",&p.year); 
printf("\n Cost: "); 
scanf("%f",&p.cost); 
fwrite(&p,sizeof(avto),1,f); 
} 




fclose(f); 
getch (); 
}



почему мне в файле выдает не русскими буквами а закарлючки....??????????????????7

Автор: xvr 15.2.2016, 16:22
Цитата(Forxi358 @  14.2.2016,  13:58 Найти цитируемый пост)
почему мне в файле выдает не русскими буквами а закарлючки

Потому что 'русские буквы' бывают разные. Рекомендую просветится на предмет кодировок. Для 'русских букв' их есть как минимум (часто используемых) 3 разных (cp1251, cp866, utf8), а максимум - с десяток  smile 

Так что какая именно у вас кодировка окажется в файле сказать трудно (она будет определяться тем, какая кодировка у вас стоит в консоли)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)