Програмата по-долу показва грешката: "грешка при сегментиране (изхвърлено ядро)".
Той трябва да покаже записа на плосък файл с помощта на вектор, да прочете записа на всеки ред и да получи полето и да го върне обратно във вектора r_record. И натиснете обратно в масата.
//.. includes
#define LIMIT 72
#define FIELD 25
using namespace std;
typedef vector <string> record_t;
typedef vector <record_t> table_t;
char line[FIELD];
string s_field;
table_t table;
record_t r_record;
void getField(char s[LIMIT])
{
char field[LIMIT];
int i=0;
r_record.clear();
while(s[i] != '\n')
{
if (s[i] != '\t' )
{
field[i] = s[i];
//*s_field = *s_field+1;
}
i++;
}
s_field = field;
r_record.push_back(s_field);
}
void getLine(FILE *fp)
{
char c;
int j=0;
table.clear();
l1:while ( (c = getc(fp)) != EOF )
{
if( c != '\n' )
{
line[j] = c;
}
j++;
}
getField(line);
table.push_back(r_record);
if(c != EOF)
goto l1;
cout<<table.size();
}
int main()
{
double total_time;
clock_t start, end;
start = clock();//time count starts
FILE *f1;
f1 = fopen("somesamplefile.txt","r+");
getLine(f1);
end = clock();//time count stops
total_time = ((double) (end - start)) / CLOCKS_PER_SEC; //calulate total time
printf("\nTime taken to print %f\n", total_time);
return 0;
}
if ( f1 == NULL ) exit(EXIT_FAILURE);
преди да направитеgetLine(f1);
- person M.M   schedule 29.12.2014char c;
трябва да бъдеint c;
в противен случай EOF цикълът не работи - person M.M   schedule 29.12.2014getLine
причинява препълване на буфера, трябва да спре, преди да достигне LIMIT.getField
също трябва да спре, преди да достигне LIMIT. Можете да избегнете тези проблеми, като използватеstd::string
иstd::getline
. - person M.M   schedule 29.12.2014