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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Тип String 
:(
    Опции темы
Fixin
Дата 6.8.2005, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

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



Измени код
Код
printf("Fatal error: Can't open file!\n\nProgram aborted. Press any key...");
На
Код
printf("Fatal error: Can't open file %s!\n\nProgram aborted. Press any key...", file_name.c_str());

Добавлено @ 20:14
И посмотри, что напишет.
PM MAIL ICQ   Вверх
mr.Anderson
Дата 7.8.2005, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


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

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



Ладно, сейчас попробую.


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
mr.Anderson
Дата 7.8.2005, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


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

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



Я для верности вставил имя файла в кавычки, так он нарисовал в этих кавычках квадратик, а затем несколько пробелов, общая длина которых равна длине имени файла! А вы сами попробуйте! Вот мой полный код:
Код

//---------------------------------------------------------------------------

#include <vcl.h>
#include <stdio.h>
#include <conio.h>
#include <string>
using namespace std;

//---------------------------------------------------------------------------
#pragma hdrstop
#pragma argsused
//---------------------------------------------------------------------------

void rebuild_source_file(string file_name);
void main(void)
{
 string name_of_file;
 printf("Enter name of source file (*.c): ");
 scanf("%s",&name_of_file);
 rebuild_source_file(name_of_file);
}
void rebuild_source_file(string file_name)
{
 FILE *c_file;
 if((c_file=fopen(file_name.c_str(),"r"))==NULL)
 {
  printf("Fatal error: Can't open file %s!\n\nProgram aborted. Press any key...",file_name.c_str());
  getch();
  abort();
 }
 else
 {
  int x;
  while((x==getc(c_file))!=EOF)
  {
  printf("This text was founded in your file:\n%c",x);
  }
 }
}

Имя файла у меня "text.txt". Я его изначально создал в директории программы и попытался открыть. Ноль внимания (в смысле, ошибка).

И еще вопрос. Почему, когда я переменную file_name заранее переделал в строковый тип вот так:
Код

file_name=file_name.c_str();

Чтобы потом не забывать это писать и не ошибаться, компайлер снова заорал, что в fopen не может быть типа char (!)?


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Void
Дата 7.8.2005, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


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

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



sim7
Давайте уже определяться, что мы используем - сишные строки и stdio или std::string и iostreams. Потому что одно с другим плохо сочетается.
Код
scanf("%s",&name_of_file);

Вот за это люди и не любят stdio. Компилятор молча пропустил грубейшую ошибку: если в строке формата стоит %s, то в качестве параметра должен быть char*, ссылающийся на буфер достаточной длины. А мы что передали? Правильно, указатель на объект типа std::string. Что у нас получилось? Правильно, undefined behaviour и вообще повезло, что все сразу не упало.

Код
while((x==getc(c_file))!=EOF)

Это попытка избежать варнинга? Неудачная, потому что в данном случае надо именно:
Код
while((x = getc(c_file)) != EOF)



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


iOS Lead Developer
****


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

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



Цитата
или std::string и iostreams.

А как с ними делать надо? Перепишите мой код по новой...
Цитата
А мы что передали? Правильно, указатель на объект типа std::string.

А как же надо? Ведь имя файла не может быть типа char, он же хранит 1 символ...
Цитата
while((x=getc(c_file)) != EOF)

Вот это действительно моя ошибка.

В общем, перепишите мой код со string. А тоя так до след. года биться буду. smile


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
mr.Anderson
Дата 7.8.2005, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


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

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



УРА!!! smile Все заработало! smile smile Немного код переправил. Спасибо всем за советы! Вот новый код:
Код

void rebuild_source_file(string file_name);
void main(void)
{
 string name_of_file;
 cout<<"Enter name of file: "; cin>>name_of_file;
 rebuild_source_file(name_of_file);
}
void rebuild_source_file(string file_name)
{
 FILE *c_file;
 if((c_file=fopen(file_name.c_str(),"r"))==NULL)
 {
  cout<<"Fatal error: Can't open file"<<file_name.c_str()<<"!\n\nProgram aborted. Press any key...";
  getch();
  abort();
 }
 else
 {
  int x;
  cout<<"This text was founded in your file:\n";
  while((x=getc(c_file))!=EOF) cout<<x;
  cout<<"\n\nPress any key...";
  getch();
 }
}

Однако, осталась проблема. В файле text.txt, который я открываю через эту программу, находится текст:
Цитата
TEXT

Но программа, выводя содержимое файла через инструкцию else в функции перестройки файла в моем коде, выводит какие-то цифры:
Цитата
This text was founded in your file:
84698884

Press any key...

Почему так и как это исправить?


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
mr.Anderson
Дата 7.8.2005, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


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

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



Люди! Я вопрос задал! Почему читается не текст, а цифры (см. пред. пост)?! Помогите!


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Void
Дата 7.8.2005, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


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

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



sim7
Очень просто - x имеет тип int - целое число. И в cout выводится в соответствующем виде. Можно сделать вот так:
cout << char(x);
Или вовсе перейти полностью на потоки:
Код
void rebuild_source_file(const std::string &file_name) {
    std::ifstream ifs(file_name.c_str());
    if (!ifs) {
        std::cout << "Can't open file " << file_name;
    } else {
        char c;
        std::cout << "This text was found in file:\n";
        while (!ifs.eof()) {
            ifs >> c;
            std::cout << c;
        }
    }
}

std::string умеет сам выводиться в поток, поэтому писать cout << s.c_str() бессмысленно.


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


iOS Lead Developer
****


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

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



Спасибо, разобрался. Действительно, дело было в типе. Я объявил ее как int, потому что в учебнике было написано:
Цитата
Переменные типа char слишком малы, чтобы хранить значение константы EOF при чтении данных из файла, поэтому в нашем примере мы объявляем тип int...



--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Void
Дата 8.8.2005, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


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

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



sim7
В учебнике написано правильно. Но это расчитано на модель ввода/вывода stdio, где типы всегда указываются явно. А здесь опять пошла мешанина из потоков и stdio.


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


iOS Lead Developer
****


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

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



Ну, надо же. А я уж было собрался в учебнике править... smile


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0549 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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