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

Крякозябры в конце вывода :( - C++

Восстановить пароль Регистрация
 
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
22.12.2012, 20:18     Крякозябры в конце вывода :( #1
Как от них избавиться, вот мой код:
C++
#include <stdio.h>
 
//====================================
// Name: getstring
// Desc: по идее должна получать
//       текст из файла и записывать
//       его в массив
//====================================
char *getstring(const char *name)
{
    char c;
    char s[1024];
    int  n = 0;
    int  i = 0;
    FILE *file;
    
    // узнаю кол-во символов (n) в файле
    file = fopen(name, "r");
 
    while(c != EOF)
    {
        if(c != EOF)
        {
            c = fgetc(file);
            n += 1;
        }
    }
    fclose(file);
 
    // создаю массив состоящий из n символов
    char x[n];
 
    // переписываю значения n символов в созданный массив x
    file = fopen(name, "r");
 
    for (i = 0; i < n; i ++)
        x[i] = fgetc(file);
 
    fclose(file);
 
    return x;
}
 
//====================================
// Name: main
// Desc: главная функция
//====================================
int main()
{
    const char *str = getstring("vs.txt");
 
    printf("%s", str); // пишет крякозябры в конце вывода:(
 
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.12.2012, 20:18     Крякозябры в конце вывода :(
Посмотрите здесь:

C++ Нули на конце
Нули в конце массива C++
C++ Нули в конце записи n!
Пробел в конце строки C++
';' в конце блока метода? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
22.12.2012, 20:24     Крякозябры в конце вывода :( #2
массив х уничтожается после выхода из функции
zss
Модератор
Эксперт С++
 Аватар для zss
5953 / 5558 / 1787
Регистрация: 18.12.2011
Сообщений: 14,204
Завершенные тесты: 1
22.12.2012, 20:29     Крякозябры в конце вывода :( #3
В функции должно быть
C++
1
2
3
4
5
  char x=new char[n+1];
    file = fopen(name, "rt");
    for (i = 0; i < n; i ++)
        x[i] = fgetc(file);
    x[i]=0;  // обязательно записываем конец строки (число ноль)!!!!!!!!!!!!!!!!!!!!!!!
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
22.12.2012, 20:37     Крякозябры в конце вывода :( #4
1.
Цитата Сообщение от Jupiter Посмотреть сообщение
массив х уничтожается после выхода из функции
2. Он не то, чтобы уничтожается, просто память, которую он занимал, считается свободной, но по счастливой случайности она не затирается, поэтому твой код все же что-то выводит.
Цитата Сообщение от programina Посмотреть сообщение
Крякозябры в конце вывода
вывод продолжается до тех пор, пока не будет встречен символ '\0', а т.к. из файла он не читается и ты руками его в конец массива не дописываешь, поэтому выводится еще что-то "левое" и где-то потом (опять же случайно) встречается символ '\0' и выводе прекращается.

3. Это не компилируемый код (либо это С99), хотя MinGW например имеет экстеншн, который компилирует такие вещи
C++
1
char x[n];
где n не константа.

Добавлено через 25 секунд
блин, опоздал.
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
22.12.2012, 20:45  [ТС]     Крякозябры в конце вывода :( #5
Спасибо всем большое
Jupiter
22.12.2012, 21:33
  #6

Не по теме:

Цитата Сообщение от Kastaneda Посмотреть сообщение
2. Он не то, чтобы уничтожается, просто память, которую он занимал, считается свободной, но по счастливой случайности она не затирается, поэтому твой код все же что-то выводит.
это и так понятно тому кто знаком с ассемблером, а тому кто не знаком - знать не обязательно

Kastaneda
22.12.2012, 21:37     Крякозябры в конце вывода :(
  #7

Не по теме:

Цитата Сообщение от Jupiter Посмотреть сообщение
это и так понятно тому кто знаком с ассемблером
ну я просто пытался объяснить ТС'у почему содержимое файла все же выводится на экран.

Yandex
Объявления
22.12.2012, 21:37     Крякозябры в конце вывода :(
Ответ Создать тему
Опции темы

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