argon bulletin board

Експертно търсене  

Новини:

Автор Тема: Проблем със задача- c++  (Прочетена 715 пъти)

*****

  • Неактивен Неактивен
  • Публикации: 35
Проблем със задача- c++
« -: 20.01.2010, 01:49:50 »

Ако може малко помощ за следната задача...

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

    char a[100][256];
   string line;
   int i;


void spisak()
    {
      int n;
      cout<<"Kolko edi kvo si- ";cin>>n;
      cin.ignore();

       ifstream file ("d://spisak.txt");
                   for (i=0;i<=n;i++)
         {
           getline(file,line)>>a;  //Тук се присвоява низа от елементи от всеки рет на файла към съответния елемент от масива a
                             cout<<"№["<<i<<"]="<<a<<endl;
         }
    }

Пример: Ако във файла има
Иван Вазов
Еди кой си
Жан Клод Ван Дам

Резултат:
За a[0]=Иван
За a[1]=Еди
За a[2]=Жан

А целта е:

За a[0]=Иван Вазов
За a[1]=Еди кой си
За a[2]=Жан Клод Ван Дам

Тоест, как да направя така, че да не пренебрегва интервала и да се присвоят елементите до края на реда, без да бъде променян типа на променливите?
Мерси

edit:Навсякъде където има а го съпровождат квадратни скоби с i просто не се отпечатва нещо...
« Последна редакция: 20.01.2010, 01:53:55 от ***** »
Активен

antoniy

  • Управител
  • *
  • Неактивен Неактивен
  • Публикации: 723
    • http://antoniy.net/
Re:Проблем със задача- c++
« Отговор #1 -: 20.01.2010, 09:17:10 »

Я пробвай функцията fgets(). Намира се в stdio.h демек #include<cstdio> и сигнатурата му е:

char *fgets(char *s, int size, FILE *stream);

Демек подаваш за s буфера, в който да ти прочете реда, size ти е максимално колко да чете, stream ти е файла stream-а. Функцията чете до нов ред като го включва в прочетеното, та ще трябва да го махаш, ако не ти трябва. Проверката за край ти е връщаната стойност дали е NULL.

Подробност: Трябва да ползваш С варианта на работа с файлове, а не ifstream библиотеката. Не знам дали сте го учили. http://www.cprogramming.com/tutorial/cfileio.html Абе като цяло моето решение е за С, не за С++.

Поздрави
Активен
Too short signature limits.

Светослав Енков

  • Неактивен Неактивен
  • Публикации: 1864
    • Shark's Home Page
Re:Проблем със задача- c++
« Отговор #2 -: 20.01.2010, 10:58:09 »

Нямам време да ти компилирам и анализирам решението ти, но ето ти малко съвети и трикове за вход/изхода в С++ стил http://augustcouncil.com/~tgibson/tutorial/iotips.html

Антоний, твоето решение сигурно ще работи, но човека иска С++ стил.

За автора на темата: Все пак, което забелязвам, нямаш никъде проверка за грешки и по-скоро бъркаш името на файла, това "d://spisak.txt" хич не ми харесва. Трябва да е "d:\\spisak.txt".

Затова, винаги след отваряне и/или четене от файла, се проверява дали е успешна операцията! Как става това... Друга тема!
« Последна редакция: 20.01.2010, 10:59:56 от Светослав Енков »
Активен

*****

  • Неактивен Неактивен
  • Публикации: 35
Re:Проблем със задача- c++
« Отговор #3 -: 20.01.2010, 14:11:13 »

Антоний, мерси, но предпочитам да е в c++ стил.
Гн. Енков благодаря за линка, има интересни неща, но не намерих отговор на конкретния проблем.
Колкото до проверката за грешки и в частност дали съществува такъв файл -умишлено е прескочена, файлът съществува със сигурност.
Иначе наистина "d:\\spisak.txt" изглежда по-правилно от "d://spisak.txt", но компилатора не ми прави проблем за това и си открива файла.
Активен

*****

  • Неактивен Неактивен
  • Публикации: 35
Re:Проблем със задача- c++
« Отговор #4 -: 20.01.2010, 15:40:53 »

Стана, но не съвсем.
При n=5
Ако във файла има
Иван Вазов
Еди кой си
Жан Клод Ван Дам
Онзи другия
123456

Резултат
За a[0]=
За a[1]=
За a[2]=Иван Вазов
За a[3]=Еди кой си
За a[4]=Жан Клод Ван Дам

При n=3
Резултат
За a[0]=
За a[1]=
За a[2]=Иван Вазов

Тоест поради някаква причина присвоява първия ред на файла към третия елемент на масива втория към четвъртия и тъка...
Това не е голям проблем, просто ми е интересно, защо става така.Някакви идеи?

Eто го и кода

                                for (i=0;i<n;i++)
         {
                     file.getline(a,256);
            cout<<"№["<<i<<"]="<<a<<endl;
         }

По-сериозния проблем е, че като му задам примерно да отпечата шестия символ в четвъртия масив
               cout<<"a[3][6]= "<<a[3][6]<<endl;

Резултат

a[3][6]=й

Цел

a[3][6]=о

Тоест, пак прескача интервала, а не желая.Как да го оправя?
Активен