2 / 2 / 0
Регистрация: 18.12.2016
Сообщений: 61
1

Работа с файлами (найти маленький косяк)

22.12.2016, 20:17. Показов 664. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите найти косяк в программе. Нужно считать слов с одного файла и перезаписать их в обратном порядке в другой файл. Считывание файла я сделал, вывод тоже работает, вроде и алгоритм вывода задом наперед сделал, но во второй файл выводит, то что было в первом. Код в функции task() происходят действия со строками.
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
#include<iostream>
#include<fstream>
#include<cstring>
#include<stdlib.h>
using namespace std;
 
void openFile(){
    char buff[50];
    char filename[50];
    cout<<"Enterfilename: ";
    cin>>filename; 
    ifstream fin(filename);
    fin.getline(buff, 50);
cout<<"File = "<<filename<<" have = "<<buff<<endl; 
fin.close(); 
}
 
 
void setData(){
    char buff[100];
    char filename[50];
    cout<<"Enter filename: ";
    cin>>filename; 
    ofstream fout(filename, ios_base::out | ios_base::trunc);
    cout<<"Enter data: ";
    gets(buff);
    fout<<gets(buff);
    fout.close();
}
 
void task(){
    char string[50];
    char nfileName[50], filename[50];
    cout<<"Enter filename foropen file: ";
    cin>>filename;
    cout<<endl;
    ifstream fin(filename);//÷èòàííÿ ç ôàéëóäàíèõ
    fin.getline(string, 50); 
    cout<<"File "<<filename<<" consistis = "<<string<<endl;
    fin.close();
    cout<<"Enter new name file for rewriting: ";
    cin>>nfileName;
    cout<<endl;
 
//ñòâîðåííÿ íîâîãî ôàéëó äëÿ ïåðåçàïèñó
    ofstream fout(nfileName, ios_base::out | ios_base::trunc);
 
    char *buf = strtok(string, " ");
    while (buf != NULL){
        char *line = new char[strlen(buf)];
        int k = 0;
        for (int i = strlen(buf)-1; i >= 0; i--){
            line[i] = buf[i];
            //k++;
        }
        
        line[strlen(line)-1] = ' ';
        fout<<line;
        delete line;
        buf = strtok(NULL, " ");    
    }
    fout.close();
}
int main(int argc, char** argv) {
    char name[50];
    char menu;
    
    do{
        cout<<"< 1. Openfile. 2. SetDatafile . 3. Completetask. 4. Exit>: ";
        cin>>menu;
        cout<<endl;
        switch(menu){
        case '1':
            openFile();
            break;
        case '2':
            setData();
            break;
        case '3':
            task();
            break;
        }       
    }
    while(menu != '4');
    system("pause");
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.12.2016, 20:17
Ответы с готовыми решениями:

Маленький косяк с шаблоном класса
Задание: Разработать шаблонный класс для работы с очередью. Должны быть реализованы операции...

Маленький вопрос по работе с файлами
очень глупый к тому же) есть FILE * f=fopen(filename,&quot;r&quot;); FILE* F; как мне присвоить*F=*f?...

Работа с файлами ( найти ошибку)
Мне нужно реализовать программу таким образом:Все выходные данные записываются в файл,и входные...

Работа с файлами (найти ошибку в коде)
Здравствуйте, столкнулся с такой проблемой. Написал программу, без считывания и вывода в файл она...

8
Maxim Prishchepa
22.12.2016, 20:21
  #2

Не по теме:

найти маленький косяк
Косяк найдет:
Кликните здесь для просмотра всего текста
Работа с файлами (найти маленький косяк)

0
Эксперт С++
1936 / 1048 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
22.12.2016, 20:35 3
какой-то странный к вас код, вы и потоки пользуете и в то же время strtok ковыряете...

я бы так переписал:

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
#include <string>
#include <sstream>
#include <vector>
 
void split(const std::string &s, char delim, std::vector<std::string> &elems) {
    std::stringstream ss;
    ss.str(s);
    std::string item;
    while (std::getline(ss, item, delim)) {
        elems.push_back(item);
    }
}
 
 
std::vector<std::string> split(const std::string &s, char delim) {
    std::vector<std::string> elems;
    split(s, delim, elems);
    return elems;
}
 
 
void task(){
    char str[50];
    char nfileName[50], filename[50];
    cout<<"Enter filename foropen file: ";
    cin>>filename;
    cout<<endl;
    ifstream fin(filename);//Г·ГЁГІГ*Г*Г*Гї Г§ ГґГ*éëóäГ*Г*ГЁГµ
    fin.getline(string, 50); 
    cout<<"File "<<filename<<" consistis = "<<str<<endl;
    fin.close();
    cout<<"Enter new name file for rewriting: ";
    cin>>nfileName;
    cout<<endl;
 
//ñòâîðåГ*Г*Гї Г*îâîãî ГґГ*éëó äëÿ ïåðåçГ*ГЇГЁГ±Гі
    ofstream fout(nfileName, ios_base::out | ios_base::trunc);
 
    vector<string> words = split(std::string(str), ' '); 
    for (auto i = words.rbegin(); i != words.rend(); i++)
    {
         fout << *i << endl;
    }
    fout.close();
}
0
2 / 2 / 0
Регистрация: 18.12.2016
Сообщений: 61
22.12.2016, 20:52  [ТС] 4
Эх если бы нас векторам учили... А то на лекциях ни слова про них не было и за 4 года в технаре тоже...

Добавлено через 7 минут
Ругается на цикл
{ссылка удалена модератором}
0
sourcerer
22.12.2016, 21:08
  #5
 Комментарий модератора 
Croix, пожалуйста, прочитайте правила форума.
Особое внимание обратите на пункты 5.18 и 5.19.
Код скопируйте непосредственно в тело сообщения, не забыв оформить его тегами.
0
Модератор
Эксперт CЭксперт С++
5148 / 2328 / 339
Регистрация: 20.02.2013
Сообщений: 5,720
Записей в блоге: 20
22.12.2016, 21:09 6
Цитата Сообщение от Croix Посмотреть сообщение
Эх если бы нас векторам учили...
Croix, никто не будет Вас за ручку водить. Учитесь сами:
Цитата Сообщение от gru74ik Посмотреть сообщение
vector (а точнее - std:vector) - это такой тип из стандартной библиотеки C++. Этот тип моделирует (эмулирует?) поведение динамического массива. То есть, такого массива, в который можно легко добавлять элементы, удалять элементы и т.д. Про вектора масса информации и в книгах и в сети.
0
2 / 2 / 0
Регистрация: 18.12.2016
Сообщений: 61
22.12.2016, 22:35  [ТС] 7
Вот ругается на цикл.
В куске кода
C++
1
 for (auto i = words.rbegin(); i != words.rend(); i++)
69 15 H:\Çàäàíèÿ ïî ÎÏ\l7.cpp [Error] 'i' does not name a type
69 35 H:\Çàäàíèÿ ïî ÎÏ\l7.cpp [Error] expected ';' before 'i'
69 35 H:\Çàäàíèÿ ïî ÎÏ\l7.cpp [Error] 'i' was not declared in this scope

Добавлено через 1 час 16 минут
Типо компилятор не понимает тип auto? Компилирую через Dev
0
Модератор
Эксперт CЭксперт С++
5148 / 2328 / 339
Регистрация: 20.02.2013
Сообщений: 5,720
Записей в блоге: 20
23.12.2016, 07:36 8
Цитата Сообщение от Croix Посмотреть сообщение
компилятор не понимает тип auto?
Да. Потому что такая интерпретация ключевого слова auto появилась только в C++11. Поэтому надо включить в своём компиляторе поддержку стандарта C++11. Либо задать тип итератора явно:
C++
1
for (std::vector<std::string>::reverse_iterator i = words.rbegin(); i != words.rend(); i++)
0
2 / 2 / 0
Регистрация: 18.12.2016
Сообщений: 61
23.12.2016, 08:24  [ТС] 9
Спасибо.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.12.2016, 08:24
Помогаю со студенческими работами здесь

Работа с файлами, помогите найти ошибку.
Нужно написать программу которая будет выписывать в файл значения синуса от 0 до 2Pi с шагом Pi/11...

Найти решение ошибки! Работа с файлами
Пишет ошибку в процедуре formir3. Ругается на &quot;c&quot;. { uses crt; type intfile=file of integer;...

Работа с файлами, найти ошибки в коде
Почему прога не работает подскажите в чём проблема . Program Zapfile; Uses Crt; type ff= ...

Работа с файлами. Найти контрольную сумму
Помогите составить задачу. Файл текстовый. Алгоритм контрольной суммы стандартный. Составить...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru