Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Считывание и разбитие инфы из файла


Автор: champion 2.12.2006, 17:48
Доброе время суток!
В С++ я новичек, и хотел попросить Вас объяснить мне, как получить содержание файла? Потом разбить его его на массивы? К примеру первая строка это значение одной переменной, остальные есть координаты:
10 10
0 100
и т.п.
Как все это запихнуть в массив?
Вот все, что я смог написать smile
Код

 FILE* READ = fopen("input.txt", "r");
 if(!READ) {
  cout << "error";
 }else{
  cout << "file opened;";
 }
 fclose(READ);

Автор: timurka 2.12.2006, 19:09
Подскажите, пожалуйста! Как можно считывать с файла линию цифр? Можно ли это делать при помощи getline()? 
Код

{    
ifstream inputfile;
inputfile.open("file.txt");
float zifr[46],zifr2[46];
inputfile.getline(zifr,sizeof(zifr));
inputfile.getline(zifr2,sizeof(zifr2));
{
if (zifr==1234) cout<<”Текст 1”;
else if (zifr==1245) cout<<”Текст 2”;
}
{
if (zifr2==1256) cout<<”Текст 3”;
else if (zifr2==1222) cout<<” Текст 4”;
}
}

С этим кодом не получается. 

Автор: Rockie 3.12.2006, 16:59
Цитата(timurka @  2.12.2006,  19:09 Найти цитируемый пост)
Подскажите, пожалуйста! Как можно считывать с файла линию цифр? Можно ли это делать при помощи getline()? 

можно, к примеру так:
Код
#include <iostream>
#include <fstream>

using namespace std;

int main(){
  char buff[81];                     // массив для строки
  ofstream write_file("table.txt");  // создаем файл table.txt
   if (!write_file) {cout<<"No such file"; return 0; }

   for(int i=0;i<10;i++)             // пишем в файл table.txt 10 строчек
     write_file<<"String #"<<i<<endl;
     write_file.close();             // закрываем

  ifstream read_file("table.txt");   // открываем для чтения
  if (!read_file) { cout<<"No such file"; return 0; }
   while(!read_file.getline( buff, sizeof(buff) ).eof() )
     { cout<<buff<<endl;
     }

   cin.get();
   return 0;
}

Автор: GIK 3.12.2006, 20:30
champion, если хочешь занести символьные данные, то не проблема, а если хочешь их конвертить к int значению, то тогда проблематично.......
Народ, давайте разрулим тему smile  Как же всетаки переконвертить char символ в виде цифры (от 0 до 9) в int эквивалент???
Код

#include <stdio.h>
#include <iostream>
#include <fstream>
using namespace std;

int main(int argc, char* argv[])
{
char ch;
char m[128];
ifstream in;
in.open("C:\\test\\txt.txt", ios::binary);
if(!in){
  cout <<  "not this file";
  cout <<  "The haker  you unusable";
  cin >> ch;  // ya, ya  :)
}
in.getline(m, 9);
for(int i=0; i<9; i++){
 cout <<  m[i] << endl;
}
in.close();

cin.get();   // ya, ya  :)

    return 0;
}



Автор: Anikmar 3.12.2006, 21:06
Цитата(GIK @ 3.12.2006,  20:30)
Народ, давайте разрулим тему smile  Как же всетаки переконвертить char символ в виде цифры (от 0 до 9) в int эквивалент???

Если проще всего то так:
Код

char Symbol;
int Result;
Symbol = '5';
Result = Symbol - '0';


Автор: champion 10.12.2006, 11:55
Код

read.getline(m, sizeof(m)).eof()

Вы не могли бы объяснить, что есть eof()?

Добавлено @ 12:05 
И как перевести chat в int? smile Если там действительно записан Int smile

Автор: champion 10.12.2006, 12:42
И в догонку smile Если обращаться к вектору, к ключу которогонет вылазиет ошибка, как сделать, чтобы не допускать ошибок? К примеру в цикле. Проверку на сущ. значения

Автор: Xenon 10.12.2006, 15:51
champion, char в int? atoi(); А если по отделеьности для каждого элемента массива, то можешь просто код нуля отнимать, как показал Anikmar.
Цитата
EOF Function
Returns a Boolean value True when the end of a file opened for Random or sequential Input has been reached.

Автор: Rockie 10.12.2006, 18:01
Цитата(champion @  10.12.2006,  11:55 Найти цитируемый пост)
Вы не могли бы объяснить, что есть eof()?

champion, конечно! но это легко и самому сделать smile
Цитата
Indicates if the end of a stream has been reached.

 
bool eof( ) const;
 

Return Value
1 or true if the end of the stream has been reached, 0 or false otherwise.


Example:

Код
// basic_ios_eof.cpp
// compile with: /EHsc
#include <iostream>
#include <fstream>

using namespace std;

int main( int argc, char* argv[] ) 
{
   fstream   fs;
   int n = 1;
   fs.open( "C:\\basic_ios_eof.txt" );   // an empty file

   cout << fs.eof() << endl;
   fs >> n;   // Read the char in the file
   cout << fs.eof() << endl;
}


Автор: zabivator 10.12.2006, 20:50
champion, std::vector::at вместо std::vector::operator[] - доступ по индексу с проверкой диапазона. Не забываем отлавливать ексепшины: std::out_of_range

Автор: champion 11.12.2006, 06:55
Код

 while(!read.getline(m,sizeof(m)).eof()) {

В этом случае мы предварительно отводим уже память, которой ограничена m, типа char на определенное кол-во бит. Но если в строке больше символов? Как динамично изменить размер под размер строки? 

Автор: zabivator 11.12.2006, 07:14
champion, читать из потока по sizeof(m), а потом делать
Код

std::string s;
while(!read.getline(m,sizeof(m)).eof()) s+=m;

Автор: Xenon 11.12.2006, 09:17
zabivator, а не проще тогда уже читать посимвольно? smile

Автор: zabivator 11.12.2006, 12:07
Xenon, по-моему проще boost::serilisation юзать, а не велосипеды мастерить.

Автор: champion 11.12.2006, 18:05
Читать посимвольно? smile) Можно пример. Понял о чем говорите, но не представляю реализацию.

Автор: Voldemar2004 18.12.2006, 12:29
Цитата(champion @  11.12.2006,  19:05 Найти цитируемый пост)
Читать посимвольно? ) Можно пример. Понял о чем говорите, но не представляю реализацию.
Код
#include <stdio.h>
#include <iostream>

std::string Str(char *, int);

void main()
{

std::cout << Str("c:\\test.xxx", 4);

std::cin.get();

}
//---------------------------------------------------------------------------

std::string Str (char *fname, int count)
{
   FILE *stream;
   char ch;

   std::string buff;

   stream = fopen (fname, "r");

    fseek(stream, 0, SEEK_SET);

       unsigned long i=0;

    do
       {

       ch = fgetc(stream);

           buff += ch;

           ++i;

        }
        while (i!=count);

   fclose (stream);

return buff;
}
Я сделал так, чтобы читалось заданное количество символов из текстового файла. Ф-ция fgetc - читает посимвольно. smile 

Автор: Voldemar2004 18.12.2006, 13:00
Цитата(GIK @  3.12.2006,  21:30 Найти цитируемый пост)
а если хочешь их конвертить к int значению, то тогда проблематично.......
GIK, atoi(<число типа int>) smile 


Автор: Anikmar 18.12.2006, 13:14
Цитата(Voldemar2004 @ 18.12.2006,  13:00)
atoi(<число типа int>) smile

Неа

<число типа int> = atoi(<строка типа строка>)

Автор: Oleg_Ci 18.12.2006, 19:06
Цитата(champion @  2.12.2006,  20:48 Найти цитируемый пост)
... объяснить мне, как получить содержание файла?

Код

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main(int argc, char *argv[])
{
    ifstream file( "text.txt" );
    if( !file.is_open()) return 1;
    string str;
// выводим все цыфры на консоль
    while( !file.eof()){
        file >> str;
        cout << atoi(str.c_str()) << "\n";
    }
    getchar();
    return 0;
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)