2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




На страницу 1, 2  След.
 
 Потоки в Си++
Сообщение03.12.2014, 19:46 
Здравствуйте. Задача такова:
"Написать программу, которая будет считывать содержимое текстового файла. При этом должна быть возможность во время считывания данных из файла по требованию (т.е. при введении с консоли заранее определенного символа) отобразить количество считанных из файла символов. Также должна быть возможность приостановки и прерывания выполнения программы."
Есть 2 вопроса.
1. Как подключить к коду файл?
2. Как написать эту прогу с помощью потоков?

 
 
 
 Re: Потоки в Си++
Сообщение03.12.2014, 20:53 
newfag в сообщении #939778 писал(а):
Как подключить к коду файл?
А что, тот кто задал задачу вам не рассказал об этом? Ну воспользуйтесь ifstream.

-- 03.12.2014, 21:54 --

newfag в сообщении #939778 писал(а):
Как написать эту прогу с помощью потоков?
А в чём конкретная проблема?

 
 
 
 Re: Потоки в Си++
Сообщение03.12.2014, 21:01 
Не рассказал. Сам разбираюсь.
При таком коде:
#include <stdarg.h>
#include <iostream>
#include <fstream>
#include <iomanip>
#include <stdlib.h>
using namespace std;
int main()
{
setlocale(LC_ALL, "RUS");
int n = 0;
float a;
fstream F;
F.open("C:\\Documents\\textdocument.txt");
if (F)
{
while (!F.eof())
{
F >> a;
cout << a << "\t";
n++;
}
F.close();
cout << "n=" << n << endl;
}
else cout << " Файл не существует" << endl;
system("pause");
return 0;
getchar();
}
ошибок не выдает, но в окне до бесконечности появляется цифра 2.258.


Конкретная проблема в том, что я не понимаю потоков в принципе. И как применить их в условиях данной задачи, соответственно, тоже.

 
 
 
 Re: Потоки в Си++
Сообщение03.12.2014, 21:10 
Тут нужны потоки в смысле thread, а будут ли stream в коде — безразлично. Очевидно, минимумом будет два потока — один основной, с консолью, и другой, читающий файл.

 
 
 
 Re: Потоки в Си++
Сообщение03.12.2014, 21:11 
Вы проверяете только eof флаг, а ввод может не сработать по другим причинам, например, неправильный формат данных.
Вместо
Код:
while ( !F.eof() )
напишите
Код:
while ( !F )

Это провека всех ошибок.

Кроме того, проверять надо после ввода перед использованием переменных с результатом, т.к. именно этот ввод мог не закончиться. В вашем случае сразу после
Код:
F >> a;
надо проверить результат.
Можно и ввод, и проверку сделать в одну строчку:
Код:
if ( !(F >> a) ) error("Failed to read a");


-- Ср дек 03, 2014 13:12:44 --

arseniiv в сообщении #939830 писал(а):
Тут нужны потоки в смысле thread, а будут ли stream в коде — безразлично. Очевидно, минимумом будет два потока — один основной, с консолью, и другой, читающий файл.
Это потом, сначала надо с файлами разобраться.

 
 
 
 Re: Потоки в Си++
Сообщение03.12.2014, 21:26 
Написал While(!F) - теперь в окошке выдает только значение n равное 0
Может быть дело в том, что в моем документе содержатся не только символы типа int, которым я описываю n?

А вот с дальнейшей проверкой проблема: слово error мой Visual не знает

 
 
 
 Re: Потоки в Си++
Сообщение03.12.2014, 21:34 
newfag в сообщении #939842 писал(а):
Написал While(!F) - теперь в окошке выдает только значение n равное 0
Может быть дело в том, что в моем документе содержатся не только символы типа int, которым я описываю n?
Что значит "в моем документе содержатся не только символы типа int"?
В документе, который вы читаете командой "F>>a" должно быть текстовое представление читаемой переменной. А символы имеют тип char.

newfag в сообщении #939842 писал(а):
А вот с дальнейшей проверкой проблема: слово error мой Visual не знает
Это я так обозначил обработку ошибки чтения. Вставьте свой вариант - сообшение какое-нибудь, и выход из цикла или даже программы.

 
 
 
 Re: Потоки в Си++
Сообщение03.12.2014, 21:39 
"В документе, который вы читаете командой "F>>a" должно быть текстовое представление читаемой переменной. А символы имеют тип char."

Но я то описал их в программе как int :D
И все равно, при смене типа данных, равенство n нулю сменилось на равенство a.

 
 
 
 Re: Потоки в Си++
Сообщение03.12.2014, 22:11 
newfag в сообщении #939852 писал(а):
Но я то описал их в программе как int :D
Кого "их"?
istream через оператор >> читает из потока текстовое представление числа a. Неважно, объявлено оно int, float или double.

 
 
 
 Re: Потоки в Си++
Сообщение03.12.2014, 22:13 
Серьезно!?
Ну тогда вообще не могу понять, в чем проблема. Не считает количество символов и все тут.

P.S.
Я очень слаб в программировании, извините за тупость в элементарных вещах:)

 
 
 
 Re: Потоки в Си++
Сообщение03.12.2014, 22:39 

(Оффтоп)

venco в сообщении #939831 писал(а):
Это потом, сначала надо с файлами разобраться.
Согласен. А я мельком глянул, что ничего thread’ного нет, и дальше не смотрел. :roll:

 
 
 
 Re: Потоки в Си++
Сообщение03.12.2014, 22:44 
newfag в сообщении #939891 писал(а):
Ну тогда вообще не могу понять, в чем проблема. Не считает количество символов и все тут.
Скиньте куда-нибудь свой файл на посмотреть. Например, сюда: http://pastebin.ubuntu.com/

 
 
 
 Re: Потоки в Си++
Сообщение03.12.2014, 22:53 
Аватара пользователя
newfag в сообщении #939821 писал(а):
ошибок не выдает, но в окне до бесконечности появляется цифра 2.258.

Скомпилировал вашу программу почти "как есть". Только закомментировал несколько явно лишних строк:

код: [ скачать ] [ спрятать ]
Используется синтаксис C++
//#include <stdarg.h>
#include <iostream>
#include <fstream>
//#include <iomanip>
//#include <stdlib.h>

using namespace std;

int main(){
        setlocale(LC_ALL, "RUS");
        int n = 0;
        float a;
        fstream F;
        F.open("textdocument.txt");
        if(F){
                while(!F.eof()){
                        F >> a;
                        cout << a << "\t";
                        n++;
                }
                F.close();
                cout << "n=" << n << endl;
        }
        else cout << " Файл не существует" << endl;
        system("pause");
        return 0;
        //getchar();
}

Вот содержание текстового файла:
Код:
3.1415926 2.718281828

А вот вывод программы:
Вложение:
Screenshot_6.png

Так в чём проблема?


У вас нет доступа для просмотра вложений в этом сообщении.

 
 
 
 Re: Потоки в Си++
Сообщение03.12.2014, 22:58 
newfag в сообщении #939891 писал(а):
Серьезно!?
Ну тогда вообще не могу понять, в чем проблема.
Например, у вас в файле написано:
Код:
"12"
Тогда operator>> наткнётся на первую кавычку, которая не соответствует требуемому формату числа, отметит ошибку и вернётся, ничего не прочитав.
Это лишь один из вариантов.

newfag в сообщении #939891 писал(а):
Не считает количество символов и все тут.
И вообще, в задании требуется читать именно символы. Зачем вы читаете переменную типа float?
Вам надо пользоваться методами неформатированного ввода: istream::read() или istream::get(). Читайте документацию библиотеки C++.

newfag в сообщении #939891 писал(а):
Я очень слаб в программировании, извините за тупость в элементарных вещах:)
В таком случае вы заслуживаете плохой оценки или незачёта. К концу семестра вы уже должны знать азы.

 
 
 
 Re: Потоки в Си++
Сообщение03.12.2014, 23:01 
venco в сообщении #939948 писал(а):
Читайте документацию библиотеки C++.
Рекомендую также учебник Т. Павловской "C/C++. Программирование на языке высокого уровня". Он конечно устарел, но для подобных случаев вполне годится.

 
 
 [ Сообщений: 16 ]  На страницу 1, 2  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group