#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; //выводит то что есть в файле
// и еще всякую гадостьили выдает ошибку. почему??
}
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); //тут я пишу размер файла
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';
А ошибку выдаёт, скорее всего, из-за выделенной строки. Размер буфера у вас какой?
Ого как быстро ответели! Видно не одному мне не спится!
Классный форум!!!
Но все равно не работает:
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; // а "гадость все равно не исчезает"
"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
--
Не можешь достичь желаемого — пожелай достигнутого.
Здравствуйте, 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-й.
А чтобы проверить, открыт файл или нет, есть метод специальный:
есть файл 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;
}