Просмотр полной версии : Задачки на С++
Собственно напсиана программа котрая открывает текстовый файл и счаитывает оттуда текст,выводится на экран. Если найдена цифра от 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();
}
Сначала надо бы попытаться считывать, а потом уже проверять на 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)
Спасиб. Теперь корректно всё работает.
Простите за занудство, но этот свитч выглядит как говно :)
Ещё вопросик. Имеется текстовый файл.Структура файла следующая
login: password: group
Есть какое то условие удаление строки. Считываем файл по строкам. Условие выполнилось и надо удалить данную строку. Предположим что файловый указатель установлен на начало этой строки. Собсвенно вопрос как удалить???
Зы создание резервного файла и переписи в него всех остальных записей(которые не удовлетовряют условию), с последующей его переименовкой не катит.
Executer
28.04.2007, 10:01
А файл большой?
Можно сначала загнать все что надо в массив, а потом записать поверх в этот файл...
А файл большой?
Можно сначала загнать все что надо в массив, а потом записать поверх в этот файл...Не катит.
Yago De Malina
28.04.2007, 11:17
нужно на c++ обязательно? :)
в ворде проще будет....
только если условие подходящее
Не катит.
Нет способа в WinAPI каким-либо образом удалить кусок из середины файла. Теоретически, однако, это возможно, но при длине удаляемого куска кратной размеру блока.
Executer
28.04.2007, 11:51
Раз неудовлетворяют простые методы, можно посложнее :)
Можно сделать так:
открываем файл. Затем считываем строки, если встретили строку, которую надо удалить - запоминаем это место, далее первую строку, которую не надо удалять помещаем на это место. И обновляем запомненоое место. Вконце изменяем длину файла и сохраняем...
Evil_John
06.09.2007, 19:52
error BGI graphics not supported under Windows ??
Как избавицо от этоой ошибки? (прога фигуру чертит, но дома непашет почемуто)
плиз помогите, срочно надо))
компелятор ставил такой:
34041
Перевод: BGI raphics НЕ ПОДДЕРЖИВАЕТСЯ ВИНДОЙ. КАК исправить??? поставить Дос=) Или копать в гугл "PortTalk"
вот в этой фразе : ##error BGI graphics not supported under Windows нет ничего удивительного, библиотека-же под дос и лазиет она напрямки в видеопамять, никакая винда не выдержит к себе такого отношения
Ну вы блин даете. :D Компилируй как dos приложение и будет тебе счастье. Я просто валяюсь с вас.
Evil_John
06.09.2007, 20:53
Компилируй как dos приложение и будет тебе счастье.
ммм..., а как это зделать неподскажешь?))
ммм..., а как это зделать неподскажешь?))
В случае Borland 5.02 - TargetExpert.
Evil_John
07.09.2007, 17:23
В случае Borland 5.02 - TargetExpert.
нипоняятно 4то за TargetExpert...? :o :(
Spirakoo, учись, студент!:)
Spirakoo, учись, студент!:)
+1
На занятия надо ходить. Мало того, что в этих крякозяблях ничего не понятно, так и за спасибо лабораторку тебе делать никто не станет. :rolleyes:
1)Нет смысла учить индивида плюсам, если за те годы, что эта обезьяна провела в социуме, она не научилась хоть чуть-чуть писать на человеческом языке.
2)В этих данных явно ошибка:
Name Gender Sumballs Balls
Иванова С.В. ж 10 4 5 4 4
Петрова М.Д ж 10 5 5 4 4
Сидорова А.Ю. ж 10 5 3 4 3
Если Gender='ж', то в графе Balls должен стоять ноль.
Давно не программирвоал на С++. хм решил поразвлекаться. И нашёл замечательное недорозумение.
#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
Такой же ответ и выдаётся.
Зы Правильно ли я думаю. Если у кого есть другие компиляторы, проверьте пожалуйста.
ЗыЗы Надо бы ассемемблер изучить=)
Хотя предположение не верно.
int sum=0,i=1;
sum=(++i)+(++i)+(++i)
Выдаёт
sum = 10
i=4
Зы Если кто знает в чем дело, поделитесь знаниями.
Хотя предположение не верно.
int sum=0,i=1;
sum=(++i)+(++i)+(++i)
Выдаёт
sum = 10
i=4
Зы Если кто знает в чем дело, поделитесь знаниями.
Дело в C++. По стандарту то, что ты делаешь, делать нельзя. В том случае, если ты все-таки это делаешь, ты получаешь неопределенный результат. Который ты и наблюдаешь :)
Тебе нужно найти в стандарте главу 5, [expr]. В ней смотри пункт 4.
У меня стандарт имеет номер ISO/IEC 14882:1998(E), если будешь брать стандарт свежее - нумерация может измениться.
Тебе нужно найти в стандарте главу 5, [expr]. В ней смотри пункт 4.
У меня стандарт имеет номер ISO/IEC 14882:1998(E), если будешь брать стандарт свежее - нумерация может измениться.
Спасибо прочитал. Да для моего выражения ответ не определён. Хм жаль что gcc мне даж ворнинг не выбросил.
Спасибо прочитал. Да для моего выражения ответ не определён. Хм жаль что gcc мне даж ворнинг не выбросил.
Раз ты читаешь стандарт, почитай также документациюю на GCC. Тебя интересует опция -Wsequence-point.
vBulletin® v3.8.12 by vBS, Copyright ©2000-2024, vBulletin Solutions, Inc. Перевод: zCarot