2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 считать матрицу из файла...
Сообщение19.09.2006, 22:52 
Аватара пользователя


24/10/05
400
Не найду баг. Задача: в файле квадратная матрица - в ней числа, ее нужно считать в массив.
Код:
#include <stdio.h>
#include <stdlib.h>
#include <iostream.h>
#define N 20 // êîëâî ñòîëáåö
#define en 20 // êîëâî ñòðîê


void main(void)
{
FILE *file;
char str[400], buf[255];
int i, j;
int **a;
///////Ñ÷èòûâàåíèå êîýôôèöèåíòîâ èç ôàéëà è èõ èíèöèàëèçàöèÿ///////
if((file=fopen("one.txt","r"))==NULL)
{printf("\n ERROR!!\n");}
else
{
while(fscanf(file,"%s",str)!=EOF) ;
//fsetpos(file, &pos);

while(fgets(buf,255,file)!=NULL);

}
fclose(file);
a = malloc(N*sizeof(int));
for (i=0; i<en; i++)
a[i]=malloc(en*sizeof(int));
if((file=fopen("one.txt","r"))==NULL)
{
printf("\n ERROR!!\n");

}
else
{


for(i=0;i<en;i++)
for(j=0;j<N;j++)
{
fscanf(file,"%c",str);
a[i][j]=atoi(str);
printf("%d",a[i][j]);
}
}
fclose(file);
/////////////////////////////////////////////////////////////////



free(a);



}

 Профиль  
                  
 
 
Сообщение19.09.2006, 23:52 


24/05/06
72
А что является результатом выполнения этой программы ?
Если :
Код:
  Error!!
  Error!!

То возможно, что программа не находит файл с матрицей из-за различия имен файла, Вы свой файл в программе вызываете, как "one.txt", но возможно, что когда Вы создавали свой текстовый файл (в блокноте)с матрицей назвали его "one.txt", попробуйте этот файл назвать просто как "one" а расширение к файлу".txt" не писать в имени, т к расширение добавится автоматический.

 Профиль  
                  
 
 
Сообщение20.09.2006, 17:13 


13/07/06
68
прочитайте внимательно man fscanf, Вы неправильно его используете. Ещё я не понял, что делает и зачем нужен кусок кода между первой парой fopen():fclose() включительно.

 Профиль  
                  
 
 
Сообщение20.09.2006, 19:21 
Заслуженный участник
Аватара пользователя


23/07/05
17973
Москва
А функция main по стандарту имеет тип int.

Код:
int main(void)
{
...
return 0;
}


Вместо нуля можно указать код возврата.

 Профиль  
                  
 
 
Сообщение20.09.2006, 21:30 


13/07/06
68
если уж совсем точно, то int main (int argc, char * argv [])

 Профиль  
                  
 
 
Сообщение24.09.2006, 15:00 
Аватара пользователя


24/10/05
400
немного исправил. Считываю все хозяйство в массив, но считывается не все почему-то...
Код:

#include <iostream>
#define N 20//razmer matrizy
#define M 20//

int main()
{
   // îòêðûâàåì ôàéë
   FILE *file;
    char * file_name = "one.txt";
   file = fopen( file_name, "r" );//îòêðûâàåì íà ÷òåíèå
   if ( file == 0 )
      {
      cout<<"File not found !!! \n";
      return 1;
      }
      char mass[N*M];
      
      for (int i=0;i<N*M;i++)
      fscanf(file,"%c",&mass[i]);

       for (i=0;i<N*M;i++)
      printf("%c",mass[i]);
   fclose(file);
   return 0;
}

 Профиль  
                  
 
 
Сообщение24.09.2006, 15:39 


27/11/05
183
Северодонецк
Если уж совсем-совсем-совсем точно, то для Microsoft прототип
следующий: int main( int argc, char *argv[ ], char *envp[ ])

antosh1303, поведение любой программы сильно зависит от состава входных данных, привели бы ссылку на ваш входной файл, чтобы как-то оценить проблему...

 Профиль  
                  
 
 
Сообщение24.09.2006, 19:45 
Аватара пользователя


24/10/05
400
bekas писал(а):
привели бы ссылку на ваш входной файл, чтобы как-то оценить проблему...


в файле one.txt находится следующее(цифра один).

00000000000000000000
00000000000000000000
00000000100000000000
00000001100000000000
00000010100000000000
00000100100000000000
00001000000000000000
00001000100000000000
00000000100000000000
00000000100000000000
00000000100000000000
00000000100000000000
00000000100000000000
00000000100000000000
00000000100000000000
00000000000000000000
00000000000000000000
00000000000000000000
00000000000000000000
00000000000000000000

 Профиль  
                  
 
 
Сообщение24.09.2006, 20:33 
Заслуженный участник
Аватара пользователя


23/07/05
17973
Москва
А символы "перевод строки" и "возврат каретки" Вы учитываете при вводе? Они в файле присутствуют после каждой строки, кроме, может быть, последней. Кстати, сколько символов остаётся непрочитанных? И какой размер файла показывает операционная система?

А почему нужно читать по одному символу?

 Профиль  
                  
 
 
Сообщение26.09.2006, 03:03 


13/07/06
68
bekas ну, Microsoft извесные портачи, и за подобный прототип в приличном обществе бьют канделябрами, хотя стандартом он в принципе допустим, как и любой другой. Но причём тут этот печальный факт?

antoshka1303Всё правильно, в конце каждоё строки есть "невидимый" символ перевода строки (иногда даже два). Его нужно поскипать, либо считывать построчно. Последний вариант кажется мне менее хлопотным:

Код:
сhar mass[N*M+1]; // один символ нужен для завершающего нуля

for (i=0;i<N;i++) fscanf (file, "%s", &mass[i*M]); // считываем N строк по M символов в каждой. КОД НЕБЕЗОПАСЕН!

Информация о переводах строк в этом случае утеряется. Лишний символ в конце нужен потому что считываются не символы по одному, а строка, завешшаемая символом \0, зато без переводов строк.

 Профиль  
                  
 
 
Сообщение26.09.2006, 09:59 


26/09/06
2
а не проще ли использовать stl?
что-нибудь в стиле:

string row;
cin>>row;

PS: зачем кодить в стиле С, когда используется C++?
есть же cin, cout, string и много другого...
если это делается из-за целей оптимизации, то спешу уверить stl работает очень быстро, да и код намного читабельнее.

 Профиль  
                  
 
 
Сообщение26.09.2006, 18:58 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
GmE писал(а):
если это делается из-за целей оптимизации, то спешу уверить stl работает очень быстро, да и код намного читабельнее.

Посмотрите эту тему, либо Вы будете удивлены, либо поможете исправить С++ код. Да и по поводу читаемости есть разные мнения. Мое, например, невысокое. Правда и сравниваю я не с С.

 Профиль  
                  
 
 
Сообщение27.09.2006, 13:33 


26/09/06
2
тему посмотрел. согласен, что для той задачи stl -- не самое быстрое решение (хотя там любой алгоритм можно настроить, но не буду придираться к коду. кстати, там ссылка на код битая)
но в данном случае должно быть не хуже (или не намного хуже) си аналога, а читабельность будет значительно выше.

PS: а если не с си сравнивать, то на том же перле это будет ещё короче и проще.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 13 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group