Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.05.2015, 16:46   #1
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию Си, текстовый файл из строк

Ребят, помогите, пожалуйста, нужно сделать текстовый файл, состоящий из строк, а во второй файл записать только первые слова из каждой строки. Вот есть код, работать перестает после while

Код:
#include <stdio.h>
#include <iostream>
#include <fstream>

using namespace std;

int main()
{


    int count=0;

    cout<<"Vvedite kolichestvo strok v file:...";
    cin>>count;

    ofstream file1("vesh.txt");
    ofstream file2("slova.txt");


    for (int i=0;i<count;i++)
    {
        char stroka[80];

        cout<<"input predlogenie No: "<<i+1<<"\n\n";
        cin>>stroka;
        file1<<stroka<<"\n";

     int j=0;
        while ((stroka[j]!=' ')||(stroka[j]!=','))
        {
            file2<<stroka[j];
            j++;
        }
        file2<<"\n";

    }

    file1.close();
    file2.close();


    cout<<"Done!";




    return 0;
}
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 30.05.2015, 18:38   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
char stroka[80];
А почему не string?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.05.2015, 19:54   #3
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

программа после ввода строки зависает,

Код:
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <string.h>

using namespace std;

int main()
{


    int count=0;

    cout<<"Vvedite kolichestvo strok v file:...";
    cin>>count;

    ofstream file1("vesh.txt");
    ofstream file2("slova.txt");


    for (int i=0;i<count;i++)
    {
        string stroka;

        cout<<"input predlogenie No: "<<i+1<<"\n";
        cin>>stroka;
        file1<<stroka<<"\n";

        int j=0;
        while ((stroka[j]!=' ')||(stroka[j]!=','))
        {
            file2<<stroka[j];
            j++;
        }
        file2<<"\n";

    }

    file1.close();
    file2.close();


    cout<<"Done!";




    return 0;
}
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 30.05.2015, 20:21   #4
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

Из-за чего может не работать цикл while, если условия обрезки я написал верные, плюс запись стринг строки в файл идет некорректно
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 30.05.2015, 20:23   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ошибаешься:
Код:
#include <iostream>
#include <iostream>
#include <fstream>
using namespace std;

int main()
{
 int count=0;

    cout<<"Vvedite kolichestvo strok v file:...";
    cin>>count;
    cin.get();
    ofstream file1("d:\\1\\vesh.txt");
    ofstream file2("d:\\1\\slova.txt");


    for (int i=0;i<count;i++)
    {
        string stroka;

        cout<<"input predlogenie No: "<<i+1<<"\n\n";
        getline(cin,stroka,'\n');
        file1<<stroka<<"\n";

     int j=0,k=stroka.length();
        while (j<k && (stroka[j]!=' '))
        {
            file2<<stroka[j];
            j++;
        }
        file2<<"\n";

    }

    file1.close();
    file2.close();


    cout<<"Done!";

    return 0;
}
Ну или while (j<k && (stroka[j]!=' ') && (stroka[j]!=',')) если уж хочется и запятую считать
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.05.2015, 22:48   #6
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

Ребят, а с типизированным файлом такой фокус не проходит,
при вводе строки с пробелом происходит зацикливание





Код:
struct about_books
{
    string familiua_avtora;
    string names_book;
    int count_str;
};

вот ввод записи в файл

Код:


  about_books book;



 int kolich=0,i=1;

            ofstream fout;
            fout.open("file.txt",ios::out|ios::binary);

            while (kolich==0)
            {
                cout<<"zapis nomber: " <<i<<"\n";

                cout<<"Familiya avtora:";
                getline(cin,book.familiua_avtora,'\n');

                cout<<"Names books:";
                getline(cin,book.names_book,'\n');

                cout<<"count stranici:";
                cin>>book.count_str;

                fout.write((char*)&book,sizeof(book));
                i++;
                cout<<"Add new-0\nExit-1..9";
                cin>>kolich;

            }




            fout.close();
from dark to light)

Последний раз редактировалось Stilet; 30.05.2015 в 23:30.
Алексей_2012 вне форума Ответить с цитированием
Старый 30.05.2015, 23:35   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
а с типизированным файлом такой фокус не проходит,
Потому что string - класс.
Запись маршалить нужно:
Код:
int l=book.familiua_avtora.length();
fout.write(&l,sizeof(l));
 fout.write((char*)&book.familiua_avtora.c_str(),l);

l=book.names_book.length();
fout.write(&l,sizeof(l));
 fout.write((char*)&book.names_book.c_str(),l);

fout.write((char*)&book.count_str,sizeof(count_str));
Т.е. на каждый элемент - своя функция записи. Плюс запись длины строки перед самой строкой.
Это называется "Сериализация" или маршалинг (https://ru.wikipedia.org/wiki/%D0%9C...B8%D0%BD%D0%B3)
Идея, надеюсь, понятна?

P.S. А насчет зацикливания - Полночь на дворе. Спатки пора. Утро вечера мудренее.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.05.2015, 23:43   #8
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

идея ясна, а что если структура такая:
Код:
struct about_books
{
    char familiua_avtora[25];
    char names_book[100];
    int count_str;
};
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 31.05.2015, 08:17   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
а что если структура такая:
Тогда маршалить не надо, поскольку структура образмерена полностью.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 31.05.2015, 12:55   #10
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

Но это не решает проблемы с введенными пробелами
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Организовать текстовый файл, состоящий из N строк. Заменить в файле все маленькие латинские буквы на большие. gudok2 Паскаль, Turbo Pascal, PascalABC.NET 8 19.05.2013 11:52
Запись в текстовый файл адресов вместо строк Стремящийся Общие вопросы C/C++ 16 10.08.2012 11:02
Создать в редакторе текстовый файл, внести в него 10 строк произвольного текста. Разработать программу, к Pan_rust Паскаль, Turbo Pascal, PascalABC.NET 0 24.05.2010 23:04
Дан текстовый файл. Вывести количество содержащихся в нем символов и строк Настенька..Блонди Помощь студентам 4 12.02.2009 19:28
Текстовый файл в текстовый массив Kimimaru Общие вопросы C/C++ 1 02.12.2007 11:55