Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Файловый I/O, в TurboC++ 
:(
    Опции темы
OXOTHUK
Дата 29.12.2005, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 21.9.2005

Репутация: нет
Всего: 6



Люди у меня через неделю городская олимпиада. Раньше я писал на Паскале, но перешёл на C++. Там требуют читать из файла данные и записывать ответ. Я на си могу только записывать и только через fstream. Читать не получается. Например надо прочитать:

2 3
5
АБВ

Числа 2, 3, 5 записать в 3 int`а, а строку в char*.
Я что-то выдел, что можно через FILE, но не знаю как работает.
В паскале там всё просто с этим, мне надо так, чтобы не писать огромных функций по чтению. Help, plz.
PM MAIL   Вверх
Exekutor
Дата 29.12.2005, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 440
Регистрация: 1.11.2005
Где: Казахстан. Костан ай

Репутация: 1
Всего: 4



функции scanf и др. тебе в помощь


--------------------
[color=blue][size=2]En taro addun, ma sol larinas[/size][/color]
PM MAIL   Вверх
Void
Дата 29.12.2005, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



Ну fstream, так fstream:
Код

std::ifstream input("file.txt");
int a, b, c;
const size_t bufsize = 128;
char buf[bufsize]; // Я бы все-таки взял std::string
input >> a >> b >> c;
input.getline(buf, bufsize); // считает в buf не более bufsize - 1 символов, до конца строки



--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
TheBoss
Дата 29.12.2005, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 12.6.2005
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Код

#include <stdlib.h>
#include <stdio.h>

int main(void)
{
   FILE *stdin;
   int i;

   printf("Input an integer: ");

   /* read an integer from the
      standard input stream */
   if (fscanf(stdin, "%d", &i))
      printf("The integer read was: %i\n", i);
   else
   {
      fprintf(stderr, "Error reading an integer from stdin.\n");
      exit(1);
   }
   return 0;
}

PM MAIL ICQ   Вверх
OXOTHUK
Дата 30.12.2005, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 21.9.2005

Репутация: нет
Всего: 6



TheBoss
Что-то не совсем понял код. Объявить - объявил файл, но ни адреса, ни открытия.
Void
Ну ввёл я в прогу:
Код

#include <fstream.h>
#include <conio.h>
#include <iostream.h>

int main()
{
    clrscr();
    ifstream fin("D:\1.txt");
    int a=0, b=0, c=0;
    char str[256];
    fin>>a>>b>>c;
    fin.getline(str, 256);
    fin.close();
    cout<<a<<" "<<b<<'\n'<<c<<'\n'<<str;

    getch();
    return 0;
}

Создал файл на диске D: под именем 1.txt, ввёл туда:
2 3
5
ABC
Запустил прогу и смотрю результат:
0 0
0

Т. е. 3 нуля и пустая строка, т. е. ничего не прочиталось. Именно из-за этого и у меня не получалось.
А строки не согу, т. к. у меня Turbo C++ 3.0 и там видимо устаревший стандарт С\С++:
там нету bool и true/false(вместо них int и 1/0). Также я не нашёл string`а.

Это сообщение отредактировал(а) OXOTHUK - 30.12.2005, 16:21
PM MAIL   Вверх
dronzo
Дата 30.12.2005, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 26.11.2005
Где: Москва

Репутация: 1
Всего: 8



OXOTHUK

Код

// ifstream fin("D:\1.txt"); 
ifstream fin ("D:\\1.txt");

//fin.getline(str,256)
fin >> str;


Dev-C++ по крайней мере съел.

Это сообщение отредактировал(а) dronzo - 30.12.2005, 17:00
PM MAIL   Вверх
Void
Дата 30.12.2005, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



OXOTHUK
У тебя просто файл не открылся. Бэкслэш надо писать двойной.

Цитата(dronzo @ 30.12.2005, 18:59)
fin >> str;

Рискуем нарваться на buffer overrun. Лучше пользоваться istream::getline, раз уж у нас нет std::string.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
blackofe
Дата 30.12.2005, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 29.11.2005

Репутация: 4
Всего: 4



Цитата(OXOTHUK @ 30.12.2005, 15:43)
А строки не согу, т. к. у меня Turbo C++ 3.0 и там видимо устаревший стандарт С\С++:
там нету bool и true/false(вместо них int и 1/0). Также я не нашёл string`а.

поправьте меня, если я не прав. но, имхо, bool есть в с++ с самой первой редакции (у меня нет страуструпа первой редакции, но во второй bool точно есть). а вот string, да, появился только в третьей редакции. поскольку во второй редакции страуструп ввел шаблоны, а степанов этим воспользовался, создав STL.
PM MAIL   Вверх
LPBOY
Дата 30.12.2005, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 12.7.2005

Репутация: 20
Всего: 20



Цитата(blackofe @ 30.12.2005, 21:59)
поправьте меня, если я не прав. но, имхо, bool есть в с++ с самой первой редакции


Не читал первую редакцию, но вот что дал поиск:
http://www.intuit.ru/department/se/pbmsu/8/3.html
Цитата

...
Язык C++ вводит логический тип bool в явном виде (отметим, что этот тип появился в C++ далеко не сразу!).
...


В BC++3.0 можно сделать так:
Код

typedef enum {false, true} bool;

Все же, чем int и 0/1, несколько лучше имхо.
--------------------
Каждый человек по-своему прав, а по-моему нет...
PM MAIL   Вверх
OXOTHUK
Дата 1.1.2006, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 21.9.2005

Репутация: нет
Всего: 6



Void
Цитата
Бэкслэш надо писать двойной


Это как?

P.S. ничего не знаю, но bool мне надо вручную вводить и его готового там нет.
PM MAIL   Вверх
LPBOY
Дата 1.1.2006, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 12.7.2005

Репутация: 20
Всего: 20



Цитата(OXOTHUK @ 1.1.2006, 08:57)
Это как?

Очень просто: D:\\1.txt
--------------------
Каждый человек по-своему прав, а по-моему нет...
PM MAIL   Вверх
nikitao
Дата 1.1.2006, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


Профиль
Группа: Завсегдатай
Сообщений: 1206
Регистрация: 30.8.2005
Где: Спб

Репутация: 1
Всего: 26



OXOTHUK
Бэкслэш надо писать двойной потому что компилятор думает что следующий за ним символ вместе с ним образуют специальный символ(к примеру '\n')Представь такое имя файла
Цитата

C:\notepad.exe

Такое имя привело бы к неверной работе.
Но в С++ '\\'=='\' в обычной жизни (это тоже специальная комбинация. smile

Это сообщение отредактировал(а) nikitao - 1.1.2006, 23:24


--------------------
Жизнь - печальная штука.
PM MAIL ICQ Skype GTalk   Вверх
OXOTHUK
Дата 2.1.2006, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 21.9.2005

Репутация: нет
Всего: 6



Извиняюсь, совсем забыл. Не привык я так писать (долбанный паскаль).

Заработало(прочитал), но строку всё равно не хочет - пустая выводится.
PM MAIL   Вверх
dronzo
Дата 2.1.2006, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 26.11.2005
Где: Москва

Репутация: 1
Всего: 8



OXOTHUK, Правильно я же тебе сказал - замени fin.getline() на fin >> (про overrun читал smile ). И лучше не мешай их в одном коде. Тут дело в том, что fin>> "\n" не читает, а getline() читает и видит тот самый, непрочитанный "\n", и дальше не суётся. Можно ещё вспомогательную переменную ввести и getline-ом() читать этот одинокий "\n", но это уже извращение будет, ИМХО.

PM MAIL   Вверх
nikitao
Дата 2.1.2006, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


Профиль
Группа: Завсегдатай
Сообщений: 1206
Регистрация: 30.8.2005
Где: Спб

Репутация: 1
Всего: 26



dronzo,твое предложение не есть good еще по одной причине(помимо той что сказаал Void):
Возьмем такой файл:
239
30
566
Hello world

Очевидно,что нам нужно,чтобы в строке оказалось Hello world,а разумеется окажется Hello .Это проблему ессно решает getline.


OXOTHUK
Если не понял обьяню более наглядно.На самом деле файл который я написал выше представляет вид ,что-то типа этого:
239\n
30\n
566\n
Hello world

Оператор >> по умолчанию пропускает все знаки разделители ,затем записывает в указаную переменную данный до следующего знака разделителя или до "знака другого типа"(к примеру если строка 12345Vingrad ,то после fin>>a,окажется в a 12345).
Получается что после строки в коде
Код

fin>>a>>b>>c;

Файловый указатель указывает на последний '\n'
В свою очередь getline работает по другому:Она ничего не пропускает,но символы типа '\n' являются для нее указанием ,что это конец строки.Таковым оказывается 1 считаный ей символ=>str остается пустым.В результате всего надо просто ввести "темповый" символ.
Код

#include <fstream>
#include <conio.h>
#include <iostream>
char str[256];
using namespace std;
int main()
{
    char ch;
    ifstream fin("D:\\1.txt");
    int a=0, b=0, c=0;
    fin>>a>>b>>c;
    fin.getline(&ch,1);
    fin.getline(str,256);
    fin.close();
    cout<<a<<'\n'<<b<<'\n'<<c<<'\n'<<str;
    getch();
    return 0;
}


Это сообщение отредактировал(а) nikitao - 2.1.2006, 16:52


--------------------
Жизнь - печальная штука.
PM MAIL ICQ Skype GTalk   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1327 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.