PDA

Просмотр полной версии : Задачки на С++


M@GIC
20.03.2007, 21:33
Собственно напсиана программа котрая открывает текстовый файл и счаитывает оттуда текст,выводится на экран. Если найдена цифра от 0-9 то заменяется на её эквивалент в беквенном виде тоесть (0-ноль, 1- один итд)
Собственно написал но заметил один баг то что последний сивол выводится 2 раза. Х3 почему

#include<iostream>
#include<fstream>
#include <conio.h>
using namespace std;
int main()
{
char buffer[1];
ifstream open;
open.open("file.txt");
if (open.fail())
{
cout<<"Unable to open input file!"<<endl;
getch();
return 1;
}
while(!open.eof())
{
open.read(buffer,sizeof(buffer));
switch(buffer[0])
{
case '0':cout<<"zero";break;
case '1':cout<<"one";break;
case '2':cout<<"two";break;
case '3':cout<<"three";break;
case '4':cout<<"four";break;
case '5':cout<<"five";break;
case '6':cout<<"six";break;
case '7':cout<<"seven";break;
case '8':cout<<"eight";break;
case '9':cout<<"nine";break;
case '.':cout<<"."<<endl;break;
case '\n':break;
default :cout<<buffer[0];break;
}

}

open.close();
getch();
}

ΛLIEN
20.03.2007, 22:04
Сначала надо бы попытаться считывать, а потом уже проверять на eof, вапсТчета.


....
while(open.read(buffer,sizeof(buffer)) > 0 && !open.eof())
{
switch(buffer[0])
{
case '0':cout<<"zero";break;
case '1':cout<<"one";break;
case '2':cout<<"two";break;
case '3':cout<<"three";break;
case '4':cout<<"four";break;
case '5':cout<<"five";break;
case '6':cout<<"six";break;
case '7':cout<<"seven";break;
case '8':cout<<"eight";break;
case '9':cout<<"nine";break;
case '.':cout<<"."<<endl;break;
case '\n':break;
default :cout<<buffer[0];break;
}
}
...


Да и вообще "!open.eof()" в данном случае фтопку. =)

Просто
while(open.read(buffer,sizeof(buffer)) > 0)

M@GIC
20.03.2007, 22:19
Спасиб. Теперь корректно всё работает.

kainen
21.03.2007, 12:42
Простите за занудство, но этот свитч выглядит как говно :)

M@GIC
28.04.2007, 01:56
Ещё вопросик. Имеется текстовый файл.Структура файла следующая
login: password: group
Есть какое то условие удаление строки. Считываем файл по строкам. Условие выполнилось и надо удалить данную строку. Предположим что файловый указатель установлен на начало этой строки. Собсвенно вопрос как удалить???
Зы создание резервного файла и переписи в него всех остальных записей(которые не удовлетовряют условию), с последующей его переименовкой не катит.

Executer
28.04.2007, 10:01
А файл большой?
Можно сначала загнать все что надо в массив, а потом записать поверх в этот файл...

M@GIC
28.04.2007, 10:54
А файл большой?
Можно сначала загнать все что надо в массив, а потом записать поверх в этот файл...Не катит.

Yago De Malina
28.04.2007, 11:17
нужно на c++ обязательно? :)
в ворде проще будет....
только если условие подходящее

kainen
28.04.2007, 11:35
Не катит.
Нет способа в WinAPI каким-либо образом удалить кусок из середины файла. Теоретически, однако, это возможно, но при длине удаляемого куска кратной размеру блока.

Executer
28.04.2007, 11:51
Раз неудовлетворяют простые методы, можно посложнее :)
Можно сделать так:
открываем файл. Затем считываем строки, если встретили строку, которую надо удалить - запоминаем это место, далее первую строку, которую не надо удалять помещаем на это место. И обновляем запомненоое место. Вконце изменяем длину файла и сохраняем...

Evil_John
06.09.2007, 19:52
error BGI graphics not supported under Windows ??
Как избавицо от этоой ошибки? (прога фигуру чертит, но дома непашет почемуто)
плиз помогите, срочно надо))
компелятор ставил такой:
34041

M@GIC
06.09.2007, 20:19
Перевод: BGI raphics НЕ ПОДДЕРЖИВАЕТСЯ ВИНДОЙ. КАК исправить??? поставить Дос=) Или копать в гугл "PortTalk"



вот в этой фразе : ##error BGI graphics not supported under Windows нет ничего удивительного, библиотека-же под дос и лазиет она напрямки в видеопамять, никакая винда не выдержит к себе такого отношения

ΛLIEN
06.09.2007, 20:48
Ну вы блин даете. :D Компилируй как dos приложение и будет тебе счастье. Я просто валяюсь с вас.

Evil_John
06.09.2007, 20:53
Компилируй как dos приложение и будет тебе счастье.

ммм..., а как это зделать неподскажешь?))

ΛLIEN
06.09.2007, 21:02
ммм..., а как это зделать неподскажешь?))
В случае Borland 5.02 - TargetExpert.

Evil_John
07.09.2007, 17:23
В случае Borland 5.02 - TargetExpert.

нипоняятно 4то за TargetExpert...? :o :(

Kostyan
16.09.2007, 14:41
Spirakoo, учись, студент!:)

ΛLIEN
16.09.2007, 15:00
Spirakoo, учись, студент!:)
+1
На занятия надо ходить. Мало того, что в этих крякозяблях ничего не понятно, так и за спасибо лабораторку тебе делать никто не станет. :rolleyes:

kainen
17.09.2007, 23:43
1)Нет смысла учить индивида плюсам, если за те годы, что эта обезьяна провела в социуме, она не научилась хоть чуть-чуть писать на человеческом языке.
2)В этих данных явно ошибка:

Name Gender Sumballs Balls
Иванова С.В. ж 10 4 5 4 4
Петрова М.Д ж 10 5 5 4 4
Сидорова А.Ю. ж 10 5 3 4 3

Если Gender='ж', то в графе Balls должен стоять ноль.

M@GIC
03.08.2009, 15:19
Давно не программирвоал на С++. хм решил поразвлекаться. И нашёл замечательное недорозумение.

#include <iostream>
using namespace std;
int main()
{

int sum=0,i=1;
sum=(++i)+(++i);
cout << "sum = " << sum<<endl<<"i="<<i<<endl;
return 0;
}
В результате выводит
sum = 6
i=3

Я не ожидал такого ответа. А собсвенно ожидал
sum=5
i=3
Собсвенно надумал на одно единсвенное обьснения сего. Что мол gcc 4.3.3 упрощает для себя это выражение тоесть сначало делает два раза операцию постинкремента а дальше просто напросто умножает на 2. Хм типо наподобие (1+1)+(1+1)=(1+1)*2

Теперь если взять выражение sum=(++i)+(++i) заменить на sum=(++i)+(i++) то происходит что и должно быть, а именно икрементируем i( получается 2, дальше i будет 2 так как преинкрмент) . Дальше берём постинкремент от i (увеличится(будет 3, но не в данном выражении) тоесть в резульатет получаем
sum=2+2=4
i=3
Такой же ответ и выдаётся.

Зы Правильно ли я думаю. Если у кого есть другие компиляторы, проверьте пожалуйста.

ЗыЗы Надо бы ассемемблер изучить=)

M@GIC
03.08.2009, 15:26
Хотя предположение не верно.
int sum=0,i=1;
sum=(++i)+(++i)+(++i)
Выдаёт
sum = 10
i=4
Зы Если кто знает в чем дело, поделитесь знаниями.

kainen
03.08.2009, 17:23
Хотя предположение не верно.
int sum=0,i=1;
sum=(++i)+(++i)+(++i)
Выдаёт
sum = 10
i=4
Зы Если кто знает в чем дело, поделитесь знаниями.
Дело в C++. По стандарту то, что ты делаешь, делать нельзя. В том случае, если ты все-таки это делаешь, ты получаешь неопределенный результат. Который ты и наблюдаешь :)

Тебе нужно найти в стандарте главу 5, [expr]. В ней смотри пункт 4.
У меня стандарт имеет номер ISO/IEC 14882:1998(E), если будешь брать стандарт свежее - нумерация может измениться.

M@GIC
03.08.2009, 18:18
Тебе нужно найти в стандарте главу 5, [expr]. В ней смотри пункт 4.
У меня стандарт имеет номер ISO/IEC 14882:1998(E), если будешь брать стандарт свежее - нумерация может измениться.
Спасибо прочитал. Да для моего выражения ответ не определён. Хм жаль что gcc мне даж ворнинг не выбросил.

kainen
04.08.2009, 15:35
Спасибо прочитал. Да для моего выражения ответ не определён. Хм жаль что gcc мне даж ворнинг не выбросил.
Раз ты читаешь стандарт, почитай также документациюю на GCC. Тебя интересует опция -Wsequence-point.