PDA

Просмотр полной версии : Вопрос по работе с файлами в с++


freddi
10.01.2007, 23:03
Дан файл вида:

слово1
слово2
слово3
и тд

Необходимо написать программу, которая берет каждое слово из файла и соединяет с другим словом, например «тест:», и выводит в файл результат:

тест:слово1
тест:слово2
тест:слово3

Сам мучился но ничего не вышло(((
вот мой исходник(нерабочий, создан для 2 строчек в файле) поправьте что не так, или напишите свой вариант решения данной задачи(под ДОС, не на визуале!!!).

#include <iostream.h>
#include <fstream.h>
#include <string.h>
void main()

{
ofstream book_file("123.txt");
ifstream input_file("123.txt");
char one[64], two[64], stroka1 [128];
input_file.getline(one, sizeof(one)) ;
input_file.getline(two, sizeof(two));
cout << one << endl;
cout << two << endl;
cout<<"vvedite slovo: ";
cin.getline(stroka1,64);
book_file<< strcat(stroka1 ,one)<<strcat(stroka1 ,two);
}

_Great_
10.01.2007, 23:32
ну добавь в свой исходник цикл и всё..

nc.STRIEM
11.01.2007, 00:25
через fgets() сделай все просто...

freddi
11.01.2007, 00:41
Мой код неработает, я знаю что нужно сделать цикл чтоб было для всех строк, но код неправельный.

2 nc.STRIEM
Я не силен в си, мож ты напишешь пример или кто-нибудь хотябы))

sni4ok
11.01.2007, 01:42
#include <string>
#include <vector>
#include <fstream>
#include <sstream>
#include <functional>
#include <algorithm>

using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{

std::vector<std::string> buf;
{
std::ifstream f("123.txt");
std::copy(std::istream_iterator<std::string>(f),std::istream_iterator<std::string>(),std::back_inserter(buf));
}

std::ofstream f("123.txt");
std::transform(buf.begin(),buf.end(),
std::ostream_iterator<std::string>(f, "\n"),
std::bind1st(std::plus<std::string>(), "тест:")
);

return 0;
}

freddi
11.01.2007, 21:47
2 sni4ok

1) Неработает)))
2) Мне кажется можно сделать гараздо проще. Ты там слишком все накрутил по-моему.

sni4ok
11.01.2007, 21:52
2 sni4ok

1) Неработает)))
2) Мне кажется можно сделать гараздо проще. Ты там слишком все накрутил по-моему.

всё работает, обьясняю по пунктам
создай файл 123.txt, напиши в него
слово1
слово2
слово3
сохрани, закрой, проверь что запускаешь из тойже дириктории(можешь кстати пути на жёсткую ссылку сделать, типа c:\123.txt, вообщем запускаешь эту бадягу, после выполнения в том же файле будет следующее:
тест:слово1
тест:слово2
тест:слово3

к вопросу насчёт того что накрутил- ты не прав, у меня вызывается 2 стандартных алгоритма.. куда может быть проще?

freddi
11.01.2007, 22:18
Компилю я в Borland C++ и он мне выдает 7 ошибок:
6 из которых ссылаются на то что не может открыть инклудовские файлы и еще ошибка в
using namespace std;

sni4ok
11.01.2007, 22:34
Компилю я в Borland C++ и он мне выдает 7 ошибок:
6 из которых ссылаются на то что не может открыть инклудовские файлы и еще ошибка в
using namespace std;

ну значит компилятор у тя древний, поставь последнюю версию...
кто же виноват, что у тя компилятор самые основные вещи не поддерживает?
з.ы - единственное место в приведённом коде не соотвествующие стандарту- это название функции для точки входа, если её заменить например на
int main(int, char**), то приведённый код будет 100% коретным в любом плюсовом компиляторе, поддерживающим хотябы стандарт 98 года.

freddi
11.01.2007, 23:00
ну значит компилятор у тя древний, поставь последнюю версию...
кто же виноват, что у тя компилятор самые основные вещи не поддерживает?


Нда уж....
От компилятора здесь ничего не зависит.

Вопрос остался открытым.

sni4ok
11.01.2007, 23:10
Нда уж....
От компилятора здесь ничего не зависит.

Вопрос остался открытым.

итак ты говорил

из которых ссылаются на то что не может открыть инклудовские файлы

считаем колличество инклудов


#include <string>
#include <vector>
#include <fstream>
#include <sstream>
#include <functional>
#include <algorithm>

и вправду их 6, заметь, что если ни один инклуд не подгрузится то и std нэймспэйсу неоткуда будет взяться,
курим стандарт, а именно главу 17.4.1.2 Headers, в ней смотрим на таблицу под названием "Table 11—C++ Library Headers"


<algorithm> <iomanip> <list> <queue> <streambuf>
<bitset> <ios> <locale> <set> <string>
<complex> <iosfwd> <map> <sstream> <typeinfo>
<deque> <iostream> <memory> <stack> <utility>
<exception> <istream> <new> <stdexcept> <valarray>
<fstream> <iterator> <numeric> <strstream> <vector>
<functional> <limits> <ostream> __________________________________________________ ______________________


видим, что все 6 вышеуказанных хедеров есть в этом списке, "-" тебе за твёрдолобость.

_Great_
11.01.2007, 23:11
ну значит компилятор у тя древний, поставь последнюю версию...
кто же виноват, что у тя компилятор самые основные вещи не поддерживает?
виноват ты, потому что несешь бред полный.
using namespace std никогда не скомпилиурется без хидеров, а они у него не подключены

sni4ok
11.01.2007, 23:13
виноват ты, потому что несешь бред полный.
using namespace std никогда не скомпилиурется без хидеров, а они у него не подключены

в приведённом мной коде были инклуды, будь внимательнее.

_Great_
11.01.2007, 23:19
Компилю я в Borland C++ и он мне выдает 7 ошибок:
6 из которых ссылаются на то что не может открыть инклудовские файлыp и еще ошибка в
using namespace s
будь внимательнее ты. они у него не инклудятся

nc.STRIEM
11.01.2007, 23:50
этот код будет работать под Mv6 но не под билдером!

nc.STRIEM
12.01.2007, 00:08
мой вариант:


#include <stdio.h>
#include <fstream>
using namespace std;
void main(void)
{
FILE *f;
f=fopen("1.txt","r");
ofstream ofs("2.txt");
char byf[128],w[]="слово:";
int i=0;

while(1)
{
byf[i]=fgetc(f);
if(byf[i]==EOF)
break;
if(byf[i]=='\n')
{
ofs<<w;
for(int j=0;j<i;j++)
ofs<<byf[j];
ofs<<endl;
i=0;
continue;
}

i++;
}

}

freddi
12.01.2007, 00:13
2 nc.STRIEM

Огромное спасибо, все работает.

Только
using namespace std;
лишнее)))

sni4ok
12.01.2007, 00:19
2 nc.STRIEM

using namespace std;


а по твоему ofstream где сидит?

sni4ok
12.01.2007, 00:20
этот код будет работать под Mv6 но не под билдером!

что такое mv6?

приведённый мой код будет как минимум работать под msvc7.0 и выше, gcc, cometau, intel ну и думаю большинство других.

_Great_
12.01.2007, 11:09
Только
using namespace std;
лишнее)))

Ничуть. Это стандарт. По стандарту все, что ты подключаешь через <fstream>, <iostream> и прочие находится в пространстве имен std.
Так что либо пиши std::ofstream output_file;, либо пиши в начале using namespace std.