работа с файлами в с++ (подскажите ответ на простой вопрос)

Модератор: Модераторы разделов

Аватара пользователя
Grom15kms
Сообщения: 4
ОС: debian

работа с файлами в с++

Сообщение Grom15kms »

подскажите где ошибка. простой пример и вроде всё верно. я в мирке поспрашивал и, мне дали ссылку на английский, красивый ресурс, но ответа не нашел.

[file]
123
[file]

Код:

#include <fstream> #include <iostream> int main() { int i; std::ifstream inFile("file"); if (!inFile) cout << "error"; inFile >> i; std::cout << i; return 0; }


на консоль выводит 0
Спасибо сказали:
Аватара пользователя
dey
Сообщения: 335
ОС: OpenSuse 11.1

Re: работа с файлами в с++

Сообщение dey »

Grom15kms писал(а):
07.02.2008 05:51
подскажите где ошибка. простой пример и вроде всё верно. я в мирке поспрашивал и, мне дали ссылку на английский, красивый ресурс, но ответа не нашел.

А ошибок при компиляции никаких не выдает ?
Строчка одна неверная в приведенном коде

Код: Выделить всё

if (!inFile) cout << "error";

То есть пропущенно std::cout
В сознательных действиях должен присутствовать существенный неалгоритмический компонент.
Roger Penrose,The Emperor's New Mind
Спасибо сказали:
Аватара пользователя
deninok
Сообщения: 585
Статус: Программист С++
ОС: Debian GNU/Linux

Re: работа с файлами в с++

Сообщение deninok »

Действительно, cout надо указывать с std::, если уж не хочешь указывать общее пространство имен.
Переменную i лучше объявлять (и обнулять ее значение) непосредственно перед использованием. И потоку передавай название файла с расширением.
Короче, сделай так:

file.txt
123

Код: Выделить всё

#include <fstream>
#include <iostream>

int main() {
    std::ifstream inFile("file.txt");

    if (!inFile) std::cout << "error";

    int i = 0;
    inFile >> i;
    std::cout << i;

    return 0;
}


На консоль выводится: 123
Спасибо сказали:
netguard
Сообщения: 30

Re: работа с файлами в с++

Сообщение netguard »

dev
А ошибок при компиляции никаких не выдает ?

наверное он не копи/пастил, а в ручную набирал поэтому и косяк. Тем более что он написал:
на консоль выводит 0

значит работала программа

Grom15kms
а ты откуда запускаешь программу, не из среды разработки случайно ? Ведь среда разработки может указать другой каталог по умолчанию для приложения и файла не найдет или найдет, но другой. Код правильный.
Спасибо сказали:
Аватара пользователя
dey
Сообщения: 335
ОС: OpenSuse 11.1

Re: работа с файлами в с++

Сообщение dey »

netguard писал(а):
07.02.2008 16:12
наверное он не копи/пастил, а в ручную набирал поэтому и косяк.

Возможно, об этом должен он сам ответить
Тем более что он написал:
на консоль выводит 0

значит работала программа

Я бы не делал таких выводов , исходя из приведенного кода переменная i нигде не проинициализирована
В сознательных действиях должен присутствовать существенный неалгоритмический компонент.
Roger Penrose,The Emperor's New Mind
Спасибо сказали:
Аватара пользователя
azrael
Сообщения: 73
ОС: KUbuntu 8.04 Hardy Heron

Re: работа с файлами в с++

Сообщение azrael »

Grom15kms: Исправил в исходном коде только std::cout.
Все работает, выводится 123.
При отсутствии файла выдается ошибка.
Предлагаю для простых примеров использовать:

Код: Выделить всё

$ g++ test.cpp
$ ./a.out
Спасибо сказали:
Аватара пользователя
Grom15kms
Сообщения: 4
ОС: debian

Re: работа с файлами в с++

Сообщение Grom15kms »

наверное он не копи/пастил, а в ручную набирал поэтому и косяк...

Есть опечатки: в оригинале было cout, а std::cout. т. е. здесь всё нормально.
А ошибок при компиляции никаких не выдает ?

нет, ошибок не было.
Grom15kms, а ты откуда запускаешь программу, не из среды разработки случайно ? Ведь среда разработки может указать другой каталог по умолчанию для приложения и файла не найдет или найдет, но другой. Код правильный.

Наверное ошибка гдето здесь. поставил Гному(стандарт к дебиана, у кде что-то с локалью были проблемы). Затем поставил Anjut'у и утилиты вроде G++, make, и др.
Для ввода я использовал файл "nearest.in", который создал не в каталоге проекта, а в каталоге scr проекта, т. к. исполнимый файл Анюта именно туда и помещает. Может я не в ту директорию файл с данными помещаю? но ошибку н открытие файла не выдает. и на консоль в любом случае выдает ноль(даже если проинициализировать).
P.S. Может ли влиять тот факт что в Анюте файл с данными тоже открыт?
Спасибо сказали:
Аватара пользователя
Grom15kms
Сообщения: 4
ОС: debian

Re: работа с файлами в с++

Сообщение Grom15kms »

Кароче, я хотел зделать олимпиадные задачи на с++ в линуксе. и похоже это для меня слишком сложно(пока). кароче вот тексты с заданием, моим кодом. надеюсь кто-нибудь подскажет какую нибудь удачную среду, а то рыться и изучать что-то новое я не успеваю.

Задание:
Антон в школе начал изучать математику. Его внимание привлекло новое для него понятие числовой прямой. Антон быстро научился вычислять расстояния между двумя точками на этой прямой, задавать отрезки и интервалы на ней.
Готовясь к контрольной работе, Антон столкнулся со следующей задачей: «На числовой прямой задано n точек. Необходимо найти среди них две ближайшие». Расстояние между двумя точками числовой прямой x и y равно |x - y|.
Требуется написать программу, которая поможет Антону решить поставленную задачу.


Код с моим решением:

Код:

#include <fstream> int iN; signed long iDots[1000000]; signed long minR; signed long chislo1, chislo2; void InputData() { std::ifstream inFile("nearest.in"); inFile >> iN; for (long i=0; i<iN; i++) inFile >> iDots[i]; } void OutputData() { std::ofstream outFile("nearest.out"); outFile << minR << std::endl; outFile << chislo1 << chislo2; } int main() { long i, j; signed long r; InputData(); minR = iDots[1] - iDots[0]; if (minR < 0) minR = -minR; for (i=0; i<=iN; i++) { for (j=0; j<=i; j++) { r = iDots[i] - iDots[j]; if (r < 0) r = -r; if (r < minR) { minR = r; chislo1 = j; chislo2 = i; } } } OutputData(); return 0; }

Кстати эта анюта как то неправильно обращается с файлами. Но из под mc нельзя увидеть информацию выводимую на консоль и мешает отлдке. хоть это и другой вопрос, но может подскажете простую среду для таких программ. чтоб можно было редактировать, кнопочка compile и run.
P. S. И ещё вопрос: может в Дэбиане быть отсутствие правильных библиотек для работы с консолью. например я создал bat-file nearest.bat[g++ nearest.cpp], и открыл из гномы с помощью программы yelp. после этого у меня стало запускатьсябесчисленное множество справок, и на 400 окне я не смог работать с <Ctrl>+<Shift>+<F7>, хотя XMMS играла музыку и не заикалась :) . спасла комбинация <Ctrl>+<Alt>+<Delete> :(
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: работа с файлами в с++

Сообщение serzh-z »

Grom15kms писал(а):
08.02.2008 14:39
но может подскажете простую среду для таких программ. чтоб можно было редактировать, кнопочка compile и run.
Anjuta или gvim.


Grom15kms писал(а):
08.02.2008 14:39
P. S. И ещё вопрос
Просьба писать на русском языке, а не просто закодированной кириллицей... Не понятно.
Спасибо сказали:
netguard
Сообщения: 30

Re: работа с файлами в с++

Сообщение netguard »

Grom15kms
Я как раз про и говорил.
Сделай так, в начале программы вызови:

Код: Выделить всё

int main()
{
    system("pwd");

и посмотри какая папка на консоль выведится, в ней и должен быть файл.

Для ввода я использовал файл "nearest.in", который создал не в каталоге проекта, а в каталоге scr проекта, т. к. исполнимый файл Анюта именно туда и помещает.

Помещать то помещает, Но вызывать его она может из другого каталога, который и будет установлен как каталог по умолчанию.
создай файл
#!/bin/sh
pwd
и назови скажем тест

Код: Выделить всё

shell : chmod +x test
shell : ~/Test/SystemCmd> ./test
выведет : ~/Test/SystemCmd
shell : ~/Test/SystemCmd> cd ..
shell : ~/Test> SystemCmd/test
выведет : ~/Test
Спасибо сказали:
Аватара пользователя
wzrd
Сообщения: 323
ОС: Debian Lenny

Re: работа с файлами в с++

Сообщение wzrd »

Grom15kms писал(а):
08.02.2008 14:39
Задание:
Антон в школе начал изучать математику. Его внимание привлекло новое для него понятие числовой прямой. Антон быстро научился вычислять расстояния между двумя точками на этой прямой, задавать отрезки и интервалы на ней.
Готовясь к контрольной работе, Антон столкнулся со следующей задачей: «На числовой прямой задано n точек. Необходимо найти среди них две ближайшие». Расстояние между двумя точками числовой прямой x и y равно |x - y|.
Требуется написать программу, которая поможет Антону решить поставленную задачу.


Код с моим решением:

Код:

#include <fstream> int iN; signed long iDots[1000000]; signed long minR; signed long chislo1, chislo2; void InputData() { std::ifstream inFile("nearest.in"); inFile >> iN; for (long i=0; i<iN; i++) inFile >> iDots[i]; } void OutputData() { std::ofstream outFile("nearest.out"); outFile << minR << std::endl; outFile << chislo1 << chislo2; } int main() { long i, j; signed long r; InputData(); minR = iDots[1] - iDots[0]; if (minR < 0) minR = -minR; for (i=0; i<=iN; i++) { for (j=0; j<=i; j++) { r = iDots[i] - iDots[j]; if (r < 0) r = -r; if (r < minR) { minR = r; chislo1 = j; chislo2 = i; } } } OutputData(); return 0; }


Извините за оффтоп. Ты её не правильно написал. тебе нужно было пока отсортировать его (при чем именно qsort'ом), а потом уже пустить простенький цикл. А так как ты сделал не пройдет даже половину тестов (по времени). У меня тоже не прошел, изза того что сортировку не ту сделал.
Спасибо сказали:
Аватара пользователя
Grom15kms
Сообщения: 4
ОС: debian

Re: работа с файлами в с++

Сообщение Grom15kms »

netguard писал(а):
11.02.2008 16:26
Для ввода я использовал файл "nearest.in", который создал не в каталоге проекта, а в каталоге scr проекта, т. к. исполнимый файл Анюта именно туда и помещает.

Помещать то помещает, Но вызывать его она может из другого каталога, который и будет установлен как каталог по умолчанию.
создай файл


Во первых: файл открывается. и ошибку не выдаёт. т. е. тут в чем-то другом дело.
Во вторых: для проверки рабочей директории файлов можно использовать и более простую конструкцию, менее зависимой от платформы и простой для понимания.

Код:

std::ofstream outFile("Unikalnoe_imia"); outFile << "Файл с уникальным именем.";


потом искать файл Unikalnoe_imia. таким способом можно практически под любой платформой вычислить рабочую директорию файла.
-------------------------------------------------------
P. S. Насчет директории я всё напутал. вначале я клал файл nearest.in в папку с программой а не в рабочую. но когда я это сделал консоль ошибок не выдавала

Код:

#include <iostream> #include <fstream> ... if (!inFile) std::cout << "error";

может я не правильно проверяю наличие файла? или это была особенность анюты?
--------------------------------------------------------
P. S. S. В программе есть ошибка: надо for (j=0; j<i; j++), вместо for (j=0; j<=i; j++)
Спасибо сказали: