работа с файлами
От: hop  
Дата: 21.05.06 23:57
Оценка:
1. как определить размер файла
2. вот исходник:

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

void main()
{
    ifstream b("f:\\telbook.txt");
    char *buf = new char[];  
    b.read(buf, 22);        //тут я пишу размер файла
    b.close();
    cout << buf << endl;        //выводит то что есть в файле
     // и еще всякую гадостьили выдает ошибку. почему??
}

пока все! заранее всем спасибо...
Re: работа с файлами
От: rman Молдова  
Дата: 22.05.06 00:45
Оценка:
Здравствуйте, hop, Вы писали:


hop>1. как определить размер файла

hop>2. вот исходник:
hop> #include <iostream.h>
hop>#include <fstream.h>

hop>void main()

hop>{
hop> ifstream b("f:\\telbook.txt");
hop> char *buf = new char[];
hop> b.read(buf, 22); //тут я пишу размер файла
hop> b.close();
hop> cout << buf << endl; //выводит то что есть в файле
hop> // и еще всякую гадостьили выдает ошибку. почему??
hop>}

hop>пока все! заранее всем спасибо...


1. Размер файла определяется так
  ifstream fin("f:\\telbook.txt");

  fin.seekg(0, ios::end);  // Перемещаемся в конец файла
  int file_length = fin.tellg(); // Узнаём текущую позицию в файле
  fin.seekg(0, ios::beg);  // Возвращаемся в начало файла


2. Так писать нельзя
hop> char *buf = new char[];
hop> b.read(buf, 22); //тут я пишу размер файла
Re: работа с файлами
От: saddva  
Дата: 22.05.06 00:46
Оценка:
Здравствуйте, hop, Вы писали:


hop>1. как определить размер файла

hop>2. вот исходник:
hop> #include <iostream.h>
hop>#include <fstream.h>

hop>void main()

hop>{
hop> ifstream b("f:\\telbook.txt");
hop> char *buf = new char[];
hop> b.read(buf, 22); //тут я пишу размер файла
hop> b.close();
hop> cout << buf << endl; //выводит то что есть в файле
hop> // и еще всякую гадостьили выдает ошибку. почему??
hop>}

hop>пока все! заранее всем спасибо...


"Гадость" выводит, потому что нулевой символ в строку надо дописать самостоятельно:
b.read(buf, 22);
buf[22] = '\0';

А ошибку выдаёт, скорее всего, из-за выделенной строки. Размер буфера у вас какой?
Re: работа с файлами
От: hop  
Дата: 22.05.06 01:27
Оценка: :)
Ого как быстро ответели! Видно не одному мне не спится!
Классный форум!!!
Но все равно не работает:

ifstream b("f:\\telbook.txt");
if (!b)  //это условие тоже чёто не работает если имя не правильно (ну да ладно)
cout << "Can't open"; 

char buf[50]; //указываю явно, с размером файла завтра буду разбираться
b.read(buf, 36); //читаю 36 символов в буфер (это размер файла)
buf[37]='\0'; //37 это 0
b.close();
cout << buf << endl; // а "гадость все равно не исчезает"
Re[2]: работа с файлами
От: rg45 СССР  
Дата: 22.05.06 05:36
Оценка:
"hop" <54672@users.rsdn.ru> wrote in message news:1910307@news.rsdn.ru...
> b.read(buf, 36); //читаю 36 символов в буфер (это размер файла)
> buf[37]='\0'; //37 это 0

Индексация массивов в C/C++ начинается с нуля, поэтому в данном случае нулевой символ нужно записывать по индексу 36, а не по индексу 37. Чтоб это было легче понять, подумай, как должен был бы выглядеть этот код, если бы ты зачитывал не 36 символов, а один.
Posted via RSDN NNTP Server 2.0
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[2]: работа с файлами
От: saddva  
Дата: 22.05.06 11:08
Оценка:
Здравствуйте, hop, Вы писали:

hop>Ого как быстро ответели! Видно не одному мне не спится!

hop>Классный форум!!!
hop>Но все равно не работает:

hop>ifstream b("f:\\telbook.txt");

hop>if (!b) //это условие тоже чёто не работает если имя не правильно (ну да ладно)
hop>cout << "Can't open";

hop>char buf[50]; //указываю явно, с размером файла завтра буду разбираться

hop>b.read(buf, 36); //читаю 36 символов в буфер (это размер файла)
hop>buf[37]='\0'; //37 это 0
hop>b.close();
hop>cout << buf << endl; // а "гадость все равно не исчезает"

Насчёт того, почему "гадость", вам уже ответили — читаете символы [0;35], записываете '\0' в 37-й.
А чтобы проверить, открыт файл или нет, есть метод специальный:
if (!b.is_open())
cout << "Can't open";

или можно так:
if (b.fail())
cout << "Can't open";

Да и "if (!b)" должно вообще-то работать...
Re: работа с файлами
От: hop  
Дата: 22.05.06 21:41
Оценка:
вобщем я понял откуда "мусор":

есть файл telbook.txt — размером ну пусть 14 байт и вот значит его содержимое:
Sanya
123

так вот после цифр есть 2 раза перевод каретки. таким "макаром" я узнал размер файла:

    fin.seekg(0,  ios::end);   //  Перемещаемся  в  конец  файла 
    const int  size  =  fin.tellg();  //  Узнаём  текущую  позицию  в  файле (т.е. размер)
    fin.seekg(0,  ios::beg);   //  Возвращаемся  в  начало  файла

а потом делаю buf[size-1]='\0'; ну что бы мусора небыло. вывожу на экран и наблюдаю мусор. перевод каретки — это и есть мусор! (ну или да?!)

Что бы обнулить обычный массив пишу так buf[10]="0"; А как мне обнулить всю выделенную память?
Re[2]: работа с файлами
От: Аноним  
Дата: 22.05.06 22:32
Оценка:
Здравствуйте, hop, Вы писали:

hop>вобщем я понял откуда "мусор":


hop>есть файл telbook.txt — размером ну пусть 14 байт и вот значит его содержимое:

hop>Sanya
hop>123


hop>так вот после цифр есть 2 раза перевод каретки. таким "макаром" я узнал размер файла:

hop> fin.seekg(0, ios::end); // Перемещаемся в конец файла
hop> const int size = fin.tellg(); // Узнаём текущую позицию в файле (т.е. размер)
hop> fin.seekg(0, ios::beg); // Возвращаемся в начало файла

hop>а потом делаю buf[size-1]='\0'; ну что бы мусора небыло. вывожу на экран и наблюдаю мусор. перевод каретки — это и есть мусор! (ну или да?!)


hop>Что бы обнулить обычный массив пишу так buf[10]="0"; А как мне обнулить всю выделенную память?


Если ты уже пользуешься библиотекой STL, воспользуйся классом std::string из неё.
Вот тебе пример вывода в консоль содержимого файла

#include <iostream>
#include <string>
#include <fstream>

int main()
{
  using namespace std;

  ifstream fin("d:\\telbook.txt");

  if(!fin) 
  {
      cerr << "Unable to open file" << endl;
      return 1;
  }

  string buff;

  while(getline(fin,buff)) 
  {
      cout << buff << endl;
  }

  return 0;
}
Re[2]: работа с файлами
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 23.05.06 03:58
Оценка:
Здравствуйте, hop, Вы писали:

hop>Ого как быстро ответели! Видно не одному мне не спится!

hop>Классный форум!!!

будет еще класснее, если не забывать отбивать код тегами, чтоб подсветка была
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.