Dziwne znaki w konsoli.

0

Zacząłem pisać program, który będzie konwertował .obj na mój format modeli 3D. Napisałem funkcję, która ma wczytać linię z pliku i dla sprawdzenia (tymczasowo) wyświetla to co wczytała. Wychodzą jakieś krzaczki przed wyświetloną linijką. W konsoli wygląda to tak:

 





                                                                        ♦§¨@ü9╚⌂
]                 á☼  ZVC˝ZVC˝S_-¨ß§ěR÷gťR¨§ÓR¨§ÓRS_ZÄ♦§¨@ë1­⌂]     
á☼  →VC˝→VC˝‼_-¨í§ěR▲OťR╣§ÓR╣§ÓR‼_ZÄ §¨Dë1# 3ds Max Wavefront OBJ Exporter v0.97
b - (c)2007
Process returned 0 (0x0)   execution time : 0.062 s
Press any key to continue.

Choć pierwsza linia tekstu to tylko # 3ds Max Wavefront OBJ Exporter v0.97b - (c)2007.
Oto kod:

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

char **read_line(fstream *file /*obiekt fstream*/,short int size /*liczba znakow do wczytania*/)
{
    char *c = new char[size]; //tablica przechowywujaca wczytane znaki
    
    short int i;
    do
    {
        file -> get(c[i]);
        i++;
    }while(c[i] != 0x0D);

    for(short a;a < size ;a++) //Wypisuje na ekran tablice czytanych znakówff
    {
        cout << c[a];
    }
    return &c;
}

int main()
{
    fstream plik("F:\\Program Files\\CodeBlocks\\Projekty\\testy\\bin\\Debug\\block.obj", ios::in);
    read_line(&plik,50);
    return 0;
}

Kod dla mnie wygląda, że nie ma błędów, ale jednak to nie działa. Co jest źle?

1
for(short a;a < size ;a++)

pytanie za 100 punktów: ile wynosi 'a' przy pierwszej iteracji?
pytanie za 10 punktów: który kompilator nie pluje warningiem że używasz niezainicjalizowanej zmiennej?

1

nie inicjalizujesz zmiennej a w pętli.

@Edit, spóźniłem się

0

Już to zauważyłem tylko nie za aktualizowałem posta. ^^ Teraz po uruchomieniu Okna powiadamiają, że program przestał działać. To jest kod. Teraz wcale nic nie wyświetla. Jest jakiś algorytm na przeczytanie linii z pliku, czy wczytywanie znaków do napotkania znaku nowej lini wystarczy? Można jakoś umieścić kod w spojler?

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

int read_line(fstream *file /*obiekt fstream*/,short int size /*liczba znakow do wczytania*/)
{
    char *c = new char[size]; //tablica przechowywujaca wczytane znaki

    short int i = 0;
    do
    {
        file -> get(c[i]);
        i++;
    }while(c[i] != 0x0D); //wczytuj znaki do znaku nowej linii 0x0D (13)

    for(short int a = 0;a < size ;a++) //Wypisuje na ekran tablice czytanych znakówff
    {
        cout << c[a];
    }
    delete[] c;
    return 0;
}

int main()
{
    fstream plik("F:\\Program Files\\CodeBlocks\\Projekty\\testy\\bin\\Debug\\block.obj", ios::in);
    read_line(&plik,50);
    plik.close();
    return 0;
}

0

Ten algorytm nazywa sie spojrz w docsy przed napisaniem czegokolwiek -> http://www.cplusplus.com/reference/string/string/getline/

0

Ale ja chciałem napisać swoją funkcję, a docsy naturalnie czytałem ^^. No to chyba jednak muszę skorzystać z gotowej funkcji ;p.

0

@bajos małe pytanko: skąd wiesz że linia w pliku ma mniej niż 50 znaków? Bo na tyle zaalokowałeś miejsce a potem czytasz ile się da dopóki nie znajdziesz jakiegośtam znaku. To niezbyt mądre...

2
string readline(istream& in) {
	char c; string result;
	while((c = in.get()) != '\n' && in) result += c;
	return result;
}
2

To samo co podał @n0name_l ale na nieco inne gusta:

string readline(istream &in)
  {
   string result;
   for(char ch;(in.get(ch))&&(ch!='\n');result+=c) {}
   return result;
  }
0

Wstawiłem funkcję @n0name_l do pliku functions.cpp i zrobiłem nagłówek functions.h, który zaincludowałem w main.cpp i przy kompilacji pisze: F:\Program Files\CodeBlocks\Projekty\testy\functions.h|4|error: 'string' does not name a type|? Czemu nie działa to?

functions.cpp

 
#include "functions.h"
#include <fstream>
#include <string>

string readword(istream& in) { //czyta tekst do spacji
    char c; string result;
    while((c=in.get()) != '\n' && c != 0x20 && in) result+=c;
    return result;
}

string readline(istream& in) {
    char c; string result;
    while((c=in.get()) != '\n' && in) result+=c;
    return result;
}

functions.h

 
#ifndef functions
#define functions
string readword(istream& in);
string readline(istream& in);
#endif
0

Bo bezmyslnie skopiowales, wstaw std:: przed wszystkimi nazwami z tej przestrzeni, albo uzyj using ....

1 użytkowników online, w tym zalogowanych: 0, gości: 1