Форум программистов, компьютерный форум CyberForum.ru

Считывание файла - C++

Восстановить пароль Регистрация
 
OrmaJever
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
26.07.2012, 00:26     Считывание файла #1
ВОбщем при считывании файла стандартными способами
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
   FILE *file = fopen(filename, "r");
   if(file == NULL) {
      return;
   }
 
   buf = (char *) malloc(buflen+1);
   while ((c = getc(file)) != EOF) {
      std::cout << c;
      if(len >= buflen) {
         buflen += BUFINC;
         buf = (char *) realloc(buf, buflen+1);
      }
      buf[len++] = c;
   }
  std::cout << (int)c << (int)EOF;
файл в кодировке ANCII он обрывается и не дойдя до конца, при этом код работает правельно просто на последней итерации цикла c имеет значение -1 как и EOF, если перевести файл в UTF то считывает нормально, как я предпологаю это BOM символы, но не ужеле они имет код -1? Вопрос в том как это обойти? Как скритать файл в кодировке ANCII до конца?

Добавлено через 2 часа 15 минут
Никто не сталкивался?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.07.2012, 00:26     Считывание файла
Посмотрите здесь:

C++ считывание из файла
Считывание файла C++
C++ считывание из файла
C++ Считывание с файла
C++ Считывание из файла
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Troll_Face
 Аватар для Troll_Face
599 / 399 / 4
Регистрация: 26.04.2012
Сообщений: 2,070
26.07.2012, 00:41     Считывание файла #2
Цитата Сообщение от OrmaJever Посмотреть сообщение
ANCII
может ASCII?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
26.07.2012, 04:58     Считывание файла #3
Желательно весь код (чтобы понятно было, что такое buf, c, BUFINC, buflen, len) и файл выложить.
Не понимаю, в чём проблема. Вот этот код нормально ANSI считывает:
Код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
include <iostream>
#include <fstream>
 
int main()
{
setlocale(0,"");
 
const int BUFINC = 1;
int buflen = 0;
int len = 0;
char *buf;
char c;
char *filename = "in.txt";
 
FILE *file = fopen(filename, "r");
   if(file == NULL) 
   {
      return 0;
   }
   
   buf = (char *) malloc(buflen);
   
   while ((c = getc(file)) != EOF) 
    {
       std::cout << c;
       if(len >= buflen) 
       {
          buflen += BUFINC;
          buf = (char *) realloc(buf, buflen);
       }
       buf[len++] = c;
   }
  std::cout <<(int)c << "  " << EOF << std::endl;
 
  system("pause");
  return 0;
 }
После выхода из while в с и должно быть -1.
OrmaJever
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
26.07.2012, 22:59  [ТС]     Считывание файла #4
Цитата Сообщение от Fatal Error Посмотреть сообщение
может ASCII?
Возможно, но в редакторе написано ANSI

Цитата Сообщение от alsav22 Посмотреть сообщение
Желательно весь код (чтобы понятно было, что такое buf, c, BUFINC, buflen, len) и файл выложить.
buf, c и len, buflen просто обьявлены перед этим как char*, char, int и int, а BUFINC константа со значение 100, но до неё не доходит, изначально памяти достаточно.
Цитата Сообщение от alsav22 Посмотреть сообщение
После выхода из while в с и должно быть -1.
Да, но не когда считало только часть файла и только в одной кодировке.
Цитата Сообщение от alsav22 Посмотреть сообщение
Не понимаю, в чём проблема. Вот этот код нормально ANSI считывает
Увы но нет. Вот пример файла, это php скрипт. http://zalil.ru/33614102
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.07.2012, 02:07     Считывание файла #5
Ну, тогда так:
Код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
#include <fstream>
 
int main()
{
setlocale(0,"");
 
int buflen = 0;
char *buf;
char c;
char *filename = "index.php";
 
FILE *file = fopen(filename, "r");
   if(file == NULL) 
   {
      return 0;
   }
   
   fseek(file, 0, SEEK_END);
   buflen = ftell(file);
   fseek(file, 0, SEEK_SET);
 
   buf = (char *) malloc(buflen);
   
   for (int i = 0; i < buflen; i++) 
    {
       c = getc(file);
       std::cout << c;
       buf[i] = c;
   }
  
  system("pause");
  return 0;
 }
xADMIRALx
 Аватар для xADMIRALx
66 / 60 / 1
Регистрация: 09.06.2012
Сообщений: 291
27.07.2012, 05:53     Считывание файла #6
C++
1
2
3
buf = (char *) malloc(buflen);
 
//а как же освобождение ?

Не по теме:

Всем сердцем прошу вас не использовать cout при выводе из файла в консоль

alsav22
27.07.2012, 06:04
  #7

Не по теме:

Цитата Сообщение от xADMIRALx Посмотреть сообщение
buf = (char *) malloc(buflen);
//а как же освобождение ?
Не по теме:
Всем сердцем прошу вас не использовать cout при выводе из файла в консоль [Munched]
Спасибо за замечание. ТС, надеюсь, допишет. А в чём проблема с cout ?

xADMIRALx
 Аватар для xADMIRALx
66 / 60 / 1
Регистрация: 09.06.2012
Сообщений: 291
27.07.2012, 06:11     Считывание файла #8
alsav22
Сравните время
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
#include <time.h>
 
int main()
{
 time_t f = clock();
 for (int i = 0;i < 10000;++i)
 printf("%d\n",i);
 printf("%d сек\n",((f - clock()) / CLOCKS_PER_SEC));
  
  return 0;
 
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <time.h>
 
int main()
{
 time_t f = clock();
 for (int i = 0;i < 10000;++i)
 std::cout << i << std::endl;
 std::cout << "sek " << ((clock() - f) / CLOCKS_PER_SEC) << std::endl;
  
  return 0;
 
}
alsav22
27.07.2012, 06:21
  #9

Не по теме:

0,5 сек. разница.

xADMIRALx
27.07.2012, 06:27
  #10

Не по теме:


попробуйте 50000 в цикле фор
Да и mingw значительнее быстрее выполняет цикл..

alsav22
27.07.2012, 06:38
  #11

Не по теме:

Цитата Сообщение от xADMIRALx Посмотреть сообщение

Не по теме:


попробуйте 50000 в цикле фор
Да и mingw значительнее быстрее выполняет цикл..

3 сек. в mingv

OrmaJever
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
27.07.2012, 10:21  [ТС]     Считывание файла #12
Цитата Сообщение от alsav22 Посмотреть сообщение
Ну, тогда так: Код
спасибо, вечером приду попробую.

Цитата Сообщение от xADMIRALx Посмотреть сообщение
Всем сердцем прошу вас не использовать cout при выводе из файла в консоль
Это только для дебага, в реальной программ iostream я убираю. Да и стандартными
stdin, stdout я пока не знаю как пользоватся
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.07.2012, 10:24     Считывание файла #13
Цитата Сообщение от OrmaJever Посмотреть сообщение
Это только для дебага, в реальной программ iostream я убираю
Ну и зря. Это же С++, а не С.
KATbIK
 Аватар для KATbIK
86 / 81 / 10
Регистрация: 02.08.2011
Сообщений: 335
27.07.2012, 10:31     Считывание файла #14
Ну если C++ то смотри в сторону fstream, ifstream, ofstream.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.07.2012, 11:44     Считывание файла
Еще ссылки по теме:

Считывание с файла C++
Считывание из файла C++
Считывание с файла C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.07.2012, 11:44     Считывание файла #15
Цитата Сообщение от KATbIK Посмотреть сообщение
Ну если C++ то смотри в сторону fstream, ifstream, ofstream
Если на С++, то тогда так:
Код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>
#include <fstream>
 
using std::cout;
using std::endl;
using std::ifstream;
using std::ios;
 
 
int main()
{
   setlocale(0,"");
 
   char *filename = "index.php";
   ifstream file(filename);
   
   if(!file.is_open()) 
   {
      cout << "Error!" << endl;
      system("pause");
      return 0;
   }
   
   file.seekg(0, ios::end);
   size_t buflen = file.tellg();
   file.seekg(0, ios::beg);
   
   char *buf = new char[buflen];
   
   char c;
   for (size_t i = 0; i < buflen; i++) 
   {
       file.get(c);
       cout << c;
       buf[i] = c;
   }
   
   file.close();
   delete [] buf;
  
   cout << endl;
   system("pause");
   return 0;
 }
Yandex
Объявления
27.07.2012, 11:44     Считывание файла
Ответ Создать тему
Опции темы

Текущее время: 13:31. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru