Visual Studio C++ - Чтение строк из файла

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by lamer811, 17 May 2011.

  1. lamer811

    lamer811 Elder - Старейшина

    Joined:
    8 Nov 2009
    Messages:
    132
    Likes Received:
    39
    Reputations:
    12
    Всем доброй ночи, делаю лабу на С++
    Когда данные определяю внутри программы, то все отлично считает, но если мне нужно изменить числа, то перебивать их все очень долго. Естественно проще взять числа из файла., но столкнулся с проблемой, что числа либо вообще не считываются, либо какая-то "хрень" большая.
    До этого всегда кодил на С++ Builder 6, где со строками вроде как нормально работал, но жизнь заставила пересесть за Visual, а тут что-то по-другому

    PHP:
    #include "stdio.h"
    #include "stdafx.h"
    #include <conio.h>
    #include "math.h"
    #include<iostream>
    #include<fstream>

    double t[30]={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};
    //double N[30]={0.671293398237389,    0.79389953739567,    1.13945602395101,    1.52691642581218,    1.60171316874476,    1.58133000385315,    1.71423370637588,    1.63495791194266,    1.60874493239694,    2.19533518531663,    1.77834316252725,    1.98026892016333,    1.89870209051207,    1.79972185629265,    1.71633636210093,    1.91216614577929,    1.96049604384032,    2.0693272046881,    2.01174240045616,    1.08078730980692,    2.12499395897963,    2.9196879131742,    2.68917441733788,    2.53095916999601,    2.24293960051097,    2.06035426037763,    2.18684451147608,    2.37440010296456,    1.90086174688789,    1.84737406929494};
    double eps=0.00001;double N0=0.5;
     
    void inputmatr(int l,double N[])
      {


          
    FILE *input fopen("D://input.txt","r");
        

          for(
    int i=0i<li++)
              
    fscanf_s(input"%f", &N[i]);
              
    fclose(input);
     for(
    int i=0i<li++)
    printf"%3.8f",N[i]); printf("\n");

      }

    ... 
    ну тут уже сами вычисления

    Знаю, что поднимаю основы, но реально не работает :(
    Помогите, что делаю не так?
     
  2. X-rus

    X-rus Member

    Joined:
    22 Dec 2010
    Messages:
    88
    Likes Received:
    22
    Reputations:
    4
    Если программируешь на C++, то желательно использовать STL, а не Cишные библиотеки.

    Пример:
    Code:
    #include <fstream>
    #include <iostream>
    ...
    bool LoadNumbers(string fileName, double arr[], int arrSize) 
    {
    	ifstream inFile(fileName);
    
    	if (!inFile)
    	{
    		return false;
    	}
    
    	for (int i = 0; i < arrSize; ++i)
    	{
    		if (inFile.eof())
    		{
    			inFile.close();
    			return false;
    		}
    
    		inFile >> arr[i];
    	}
    
    	inFile.close();
    
    	return true;
    }
    
    void DisplayNumbers(double arr[], int arrSize)
    {
    	for (int i = 0; i < arrSize; ++i)
    	{
    		cout << arr[i] << endl;
    	}
    }
    
    Можно ещё так:)
    Code:
    #include <fstream>
    #include <iostream>
    #include <iterator>
    #include <algorithm>
    ...
    copy(
    	istream_iterator<double>(ifstream("1.txt")),
    	istream_iterator<double>(),
    	ostream_iterator<double>(cout, "\n"));
    
     
  3. lamer811

    lamer811 Elder - Старейшина

    Joined:
    8 Nov 2009
    Messages:
    132
    Likes Received:
    39
    Reputations:
    12
    Да пишу на С++
    Способы выше работают (спасибо), но хотелось бы узнать еще пути решения вопроса
    Сишников на форуме много :)
     
  4. becensed

    becensed Member

    Joined:
    2 Dec 2009
    Messages:
    84
    Likes Received:
    24
    Reputations:
    1
    Можно поменять double на float.
    Можно вместо %f использовать %lf.
     
    #4 becensed, 19 May 2011
    Last edited: 19 May 2011
  5. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,021
    Likes Received:
    1,200
    Reputations:
    327
    strtod юзай

    Code:
    #include <stdlib.h>
    #include <stdio.h>
    
    int main( void )
    {
       char   *string, *stopstring;
       double x;
       long   l;
       int    base;
       unsigned long ul;
    
       string = "3.1415926This stopped it";
       x = strtod( string, &stopstring );
       printf( "string = %s\n", string );
       printf("   strtod = %f\n", x );
       printf("   Stopped scan at: %s\n\n", stopstring );
    
       string = "-10110134932This stopped it";
       l = strtol( string, &stopstring, 10 );
       printf( "string = %s\n", string );
       printf("   strtol = %ld\n", l );
       printf("   Stopped scan at: %s\n\n", stopstring );
    
       string = "10110134932";
       printf( "string = %s\n", string );
     
       // Convert string using base 2, 4, and 8:
       for( base = 2; base <= 8; base *= 2 )
       {
          // Convert the string:
          ul = strtoul( string, &stopstring, base );
          printf( "   strtol = %ld (base %d)\n", ul, base );
          printf( "   Stopped scan at: %s\n", stopstring );
       }
    }
    
     
    #5 sn0w, 20 May 2011
    Last edited: 20 May 2011