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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
#1

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

22.12.2012, 20:18. Просмотров 281. Ответов 6
Метки нет (Все метки)

Как от них избавиться, вот мой код:
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++
C++ Const в конце строки
Мусор в конце строки C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6547 / 3967 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
22.12.2012, 20:24     Крякозябры в конце вывода :( #2
массив х уничтожается после выхода из функции
zss
Модератор
Эксперт С++
 Аватар для zss
6110 / 5713 / 1849
Регистрация: 18.12.2011
Сообщений: 14,586
Завершенные тесты: 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
4252 / 2784 / 219
Регистрация: 12.12.2009
Сообщений: 7,109
Записей в блоге: 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     Крякозябры в конце вывода :(
Ответ Создать тему
Опции темы

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