2014 dxdy logo

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

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




 
 считать матрицу из файла...
Сообщение19.09.2006, 22:52 
Аватара пользователя
Не найду баг. Задача: в файле квадратная матрица - в ней числа, ее нужно считать в массив.
Код:
#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 
А что является результатом выполнения этой программы ?
Если :
Код:
  Error!!
  Error!!

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

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

 
 
 
 
Сообщение20.09.2006, 19:21 
Аватара пользователя
А функция main по стандарту имеет тип int.

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


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

 
 
 
 
Сообщение20.09.2006, 21:30 
если уж совсем точно, то int main (int argc, char * argv [])

 
 
 
 
Сообщение24.09.2006, 15:00 
Аватара пользователя
немного исправил. Считываю все хозяйство в массив, но считывается не все почему-то...
Код:

#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 
Если уж совсем-совсем-совсем точно, то для Microsoft прототип
следующий: int main( int argc, char *argv[ ], char *envp[ ])

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

 
 
 
 
Сообщение24.09.2006, 19:45 
Аватара пользователя
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 
Аватара пользователя
А символы "перевод строки" и "возврат каретки" Вы учитываете при вводе? Они в файле присутствуют после каждой строки, кроме, может быть, последней. Кстати, сколько символов остаётся непрочитанных? И какой размер файла показывает операционная система?

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

 
 
 
 
Сообщение26.09.2006, 03:03 
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 
а не проще ли использовать stl?
что-нибудь в стиле:

string row;
cin>>row;

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

 
 
 
 
Сообщение26.09.2006, 18:58 
Аватара пользователя
:evil:
GmE писал(а):
если это делается из-за целей оптимизации, то спешу уверить stl работает очень быстро, да и код намного читабельнее.

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

 
 
 
 
Сообщение27.09.2006, 13:33 
тему посмотрел. согласен, что для той задачи stl -- не самое быстрое решение (хотя там любой алгоритм можно настроить, но не буду придираться к коду. кстати, там ссылка на код битая)
но в данном случае должно быть не хуже (или не намного хуже) си аналога, а читабельность будет значительно выше.

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

 
 
 [ Сообщений: 13 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group