user-0 提问: 求助！文件操作的bug，用fseek函数把txt数据导入数组之后，就不进行后面的操作了。

回复:
user: user-1
content: A=(double**)malloc(sizeof(int*)*row); A[i]=(double*)malloc(sizeof(int)*column); 改成：   A=(double**)malloc(sizeof(double*)*row); A[i]=(double*)malloc(sizeof(double)*column); 同理下面的B也需要更改。 第一个对A的申请行数，虽然指针的sizeof都是一样的，建议还要sizeof(double *)， 下面的申请A[i]就必须使用sizeof(double)了。同理B的申请一样。  #include <stdio.h> #include <stdlib.h> #include<math.h> #include<time.h> //#include <conio.h>  int main () {     double**A;     double**B;     FILE *fp;     FILE *op;     int i,j;     //double C[10];/*存放最佳匹配位置的数据*/     char ch;     int row = 0, column = 0;     int row1 = 0,column1 = 0;     //打开文件     if((fp=fopen("rf1_data.txt", "r"))==NULL){         printf("打开文件失败！\n");         return 1;     }     while(!feof(fp) && (ch = fgetc(fp)) != '\n') {         if(ch==' '){             column++;         }     }     column++;     if(column==1){         printf("没有数据！\n");         return 1;     }     printf("column=%d\n",column);     fseek(fp,0L,0);     while(!feof(fp)){         if(fgetc(fp)=='\n'){             row++;         }     }     row++;     if(row==1){         printf("没有数据！\n");         return 1;     }     printf("行数=%d\n",row);     A=(double**)malloc(sizeof(double *) * row);     if(A==NULL){         printf("no memory\n");         return 1;     }     for(i=0;i<row;i++)     {         A[i]=(double*)malloc(sizeof(double)*column);         if(A[i]==NULL)         {             printf("no memory\n");             return 1;         }     }     printf("内存分配完成成功1！\n");     fseek(fp,0L,SEEK_SET);     //rewind(fp);     while(!feof(fp)){         for(i=0;i<row;i++){             for(j=0;j<column;j++){                 fscanf(fp,"%lf", &A[i][j]);             }         }     }     printf("读取数据成功1！\n");     printf("A=%.16lf\n", A[0][0]);     printf("A=%.16lf\n", A[2][0]);     system("Pause");     //printf("内存分配完成成功2！\n");     if((op=fopen("rf2_data.txt","r"))==NULL){         printf("打开文件失败！\n");         return 1;     }     printf("代码运行到这！\n");     while(!feof(op)&&(ch=fgetc(op))!='\n'){         if(ch==' '){             column1++;         }     }     column1++;     if(column1==1){         printf("没有数据！\n");         return 1;     }     printf("column1=%d\n",column1);     fseek(op,0L,0);     while(!feof(op)){         if(fgetc(op)=='\n'){             row1++;         }     }     row1++;     if(row1==1){         printf("没有数据！\n");         return 1;     }     printf("行数1=%d\n",row1);     B=(double**)malloc(sizeof(int*)*row1);     if(B==NULL){         printf("no memory\n");         return 1;     }     for(i=0;i<row1;i++)     {         B[i]=(double*)malloc(sizeof(double)*column1);         if(B[i]==NULL)         {             printf("no memory\n");             return 1;         }     }     printf("内存分配完成成功2！\n");     fseek(op,0L,SEEK_SET);     while(!feof(op)){         for(i=0;i<row1;i++){             for(j=0;j<column1;j++){                 fscanf(op,"%lf", &B[i][j]);             }         }     }     printf("B=%.16lf\n",B[0][0]);     printf("读取数据成功2！\n");      //printf("关闭文件！\n");     system("Pause");     //关闭文件     printf("关闭文件！\n");     fclose(fp);     //fclose(op);     //释放内存     for(i=0;i<row;i++){         free(A[i]);         free(B[i]);         //free(B[i]);     }     free(A);     free(B);      return 0;  } 其他地方暂未发现问题，起码如果有数据应该能够读到。 另外，建议提供一下要读文件的内容，我怀疑你读的数据格式和你的处理方式不对。fscanf是格式化读取的，数据之间就没有空格或者其他隔开吗？

user: user-0
content: #include <stdio.h> #include <stdlib.h> #include<math.h> #include<time.h> #include <conio.h>  main (){ 	double**A; 	double**B; 	FILE *fp; 	FILE *op; 	int i,j; 	//double C[10];/*存放最佳匹配位置的数据*/ 	char ch; 	int row=0,column=0; 	int row1=0,column1=0; 	//打开文件 	if((fp=fopen("rf1_data.txt","r"))==NULL){ 		printf("打开文件失败！\n"); 		return 1; 	}  	while(!feof(fp)&&(ch=fgetc(fp))!='\n'){ 		if(ch=='	'){ 			column++; 		} 	} 	column++; 	if(column==1){ 	printf("没有数据！\n"); 	return 1; 	} 	printf("column=%d\n",column); 	fseek(fp,0L,0); 	while(!feof(fp)){ 		if(fgetc(fp)=='\n'){ 			row++;	 		} 	} 	row++; 	if(row==1){ 	printf("没有数据！\n"); 	return 1;	 	}  	printf("行数=%d\n",row); 	A=(double**)malloc(sizeof(int*)*row); 	if(A==NULL){ 		printf("no memory\n"); 		return 1; 	} 	for(i=0;i<row;i++) 	{ 		A[i]=(double*)malloc(sizeof(int)*column); 		if(A[i]==NULL) 	{ 	printf("no memory\n"); 	return 1; 	} 	} 	printf("内存分配完成成功1！\n"); 	fseek(fp,0L,SEEK_SET); 	//rewind(fp);	 	while(!feof(fp)){ 		for(i=0;i<row;i++){ 			for(j=0;j<column;j++){ 					fscanf(fp,"%Lf",&A[i][j]); 			} 		} 	} 	printf("读取数据成功1！\n"); 	printf("A=%.16lf\n",A[0][0]); 	printf("A=%.16lf\n",A[2][0]); 	system("Pause"); 	//printf("内存分配完成成功2！\n"); 	if((op=fopen("rf2_data.txt","r"))==NULL){ 		printf("打开文件失败！\n"); 		return 1; 	}  	printf("代码运行到这！\n"); 	while(!feof(op)&&(ch=fgetc(op))!='\n'){ 		if(ch=='	'){ 			column1++; 		} 	} 	column1++; 	if(column1==1){ 	printf("没有数据！\n"); 	return 1; 	} 	printf("column1=%d\n",column1); 	fseek(op,0L,0); 	while(!feof(op)){ 		if(fgetc(op)=='\n'){ 			row1++;	 		} 	} 	row1++; 	if(row1==1){ 	printf("没有数据！\n"); 	return 1;	 	}  	printf("行数1=%d\n",row1); 	B=(double**)malloc(sizeof(int*)*row1); 	if(B==NULL){ 		printf("no memory\n"); 		return 1; 	} 	for(i=0;i<row1;i++) 	{ 		B[i]=(double*)malloc(sizeof(int)*column1); 		if(B[i]==NULL) 	{ 	printf("no memory\n"); 	return 1; 	} 	} 	printf("内存分配完成成功2！\n"); 	fseek(op,0L,SEEK_SET);	 	while(!feof(op)){ 		for(i=0;i<row1;i++){ 			for(j=0;j<column1;j++){ 					fscanf(op,"%lf",&B[i][j]); 			} 		} 	} 	printf("B=%.16lf\n",B[0][0]); 	printf("读取数据成功2！\n"); 	 	//printf("关闭文件！\n"); 	system("Pause"); //关闭文件 printf("关闭文件！\n"); 	fclose(fp); 	//fclose(op); 	//释放内存 	for(i=0;i<row;i++){ 		free(A[i]); 		free(B[i]); 		//free(B[i]); 	} 	free(A); 	free(B); 	//free(B); 	return 0;  } 这是完整代码，我第一个运行到 A的值显示之后就直接结束了，是不是文件指针的问题啊

user: user-2
content: 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了

user: user-1
content: fseek做不到导入数组，它只负责更改文件指针的位置。 后面的操作是指什么操作。 建议，将问题描述更清晰一些，还有将完整代码贴出来，方便大家给你分析问题。

user: user-0
content: 引用 6 楼 自信男孩的回复:[quote=引用 5 楼 weixin_38207316 的回复:] [quote=引用 4 楼 自信男孩的回复:] A=(double**)malloc(sizeof(int*)*row); A[i]=(double*)malloc(sizeof(int)*column); 改成：   A=(double**)malloc(sizeof(double*)*row); A[i]=(double*)malloc(sizeof(double)*column); 同理下面的B也需要更改。 第一个对A的申请行数，虽然指针的sizeof都是一样的，建议还要sizeof(double *)， 下面的申请A[i]就必须使用sizeof(double)了。同理B的申请一样。  #include <stdio.h> #include <stdlib.h> #include<math.h> #include<time.h> //#include <conio.h>  int main () {     double**A;     double**B;     FILE *fp;     FILE *op;     int i,j;     //double C[10];/*存放最佳匹配位置的数据*/     char ch;     int row = 0, column = 0;     int row1 = 0,column1 = 0;     //打开文件     if((fp=fopen("rf1_data.txt", "r"))==NULL){         printf("打开文件失败！\n");         return 1;     }     while(!feof(fp) && (ch = fgetc(fp)) != '\n') {         if(ch==' '){             column++;         }     }     column++;     if(column==1){         printf("没有数据！\n");         return 1;     }     printf("column=%d\n",column);     fseek(fp,0L,0);     while(!feof(fp)){         if(fgetc(fp)=='\n'){             row++;         }     }     row++;     if(row==1){         printf("没有数据！\n");         return 1;     }     printf("行数=%d\n",row);     A=(double**)malloc(sizeof(double *) * row);     if(A==NULL){         printf("no memory\n");         return 1;     }     for(i=0;i<row;i++)     {         A[i]=(double*)malloc(sizeof(double)*column);         if(A[i]==NULL)         {             printf("no memory\n");             return 1;         }     }     printf("内存分配完成成功1！\n");     fseek(fp,0L,SEEK_SET);     //rewind(fp);     while(!feof(fp)){         for(i=0;i<row;i++){             for(j=0;j<column;j++){                 fscanf(fp,"%lf", &A[i][j]);             }         }     }     printf("读取数据成功1！\n");     printf("A=%.16lf\n", A[0][0]);     printf("A=%.16lf\n", A[2][0]);     system("Pause");     //printf("内存分配完成成功2！\n");     if((op=fopen("rf2_data.txt","r"))==NULL){         printf("打开文件失败！\n");         return 1;     }     printf("代码运行到这！\n");     while(!feof(op)&&(ch=fgetc(op))!='\n'){         if(ch==' '){             column1++;         }     }     column1++;     if(column1==1){         printf("没有数据！\n");         return 1;     }     printf("column1=%d\n",column1);     fseek(op,0L,0);     while(!feof(op)){         if(fgetc(op)=='\n'){             row1++;         }     }     row1++;     if(row1==1){         printf("没有数据！\n");         return 1;     }     printf("行数1=%d\n",row1);     B=(double**)malloc(sizeof(int*)*row1);     if(B==NULL){         printf("no memory\n");         return 1;     }     for(i=0;i<row1;i++)     {         B[i]=(double*)malloc(sizeof(double)*column1);         if(B[i]==NULL)         {             printf("no memory\n");             return 1;         }     }     printf("内存分配完成成功2！\n");     fseek(op,0L,SEEK_SET);     while(!feof(op)){         for(i=0;i<row1;i++){             for(j=0;j<column1;j++){                 fscanf(op,"%lf", &B[i][j]);             }         }     }     printf("B=%.16lf\n",B[0][0]);     printf("读取数据成功2！\n");      //printf("关闭文件！\n");     system("Pause");     //关闭文件     printf("关闭文件！\n");     fclose(fp);     //fclose(op);     //释放内存     for(i=0;i<row;i++){         free(A[i]);         free(B[i]);         //free(B[i]);     }     free(A);     free(B);      return 0;  } 其他地方暂未发现问题，起码如果有数据应该能够读到。 另外，建议提供一下要读文件的内容，我怀疑你读的数据格式和你的处理方式不对。fscanf是格式化读取的，数据之间就没有空格或者其他隔开吗？ 我的数据是用excel转过来的。可能是数据指针那里的问题吧。。除了fscanf还能用其他的么？文件指针是不是有问题？[/quote] 文件指针没问题，如果excel转过来的，那么第一次读之后再次读的时候是不是需要中间隔着一个'\t'呢 所以，你的fscanf每次读都要加一个'\t' fscanf(op,"%lf\t", &B[i][j]); 读到末尾还要改成\n[/quote] 嗯嗯解决了。还是自己不够仔细。功底太差了。。谢谢啊。

user: user-1
content: 引用 5 楼 weixin_38207316 的回复:[quote=引用 4 楼 自信男孩的回复:] A=(double**)malloc(sizeof(int*)*row); A[i]=(double*)malloc(sizeof(int)*column); 改成：   A=(double**)malloc(sizeof(double*)*row); A[i]=(double*)malloc(sizeof(double)*column); 同理下面的B也需要更改。 第一个对A的申请行数，虽然指针的sizeof都是一样的，建议还要sizeof(double *)， 下面的申请A[i]就必须使用sizeof(double)了。同理B的申请一样。  #include <stdio.h> #include <stdlib.h> #include<math.h> #include<time.h> //#include <conio.h>  int main () {     double**A;     double**B;     FILE *fp;     FILE *op;     int i,j;     //double C[10];/*存放最佳匹配位置的数据*/     char ch;     int row = 0, column = 0;     int row1 = 0,column1 = 0;     //打开文件     if((fp=fopen("rf1_data.txt", "r"))==NULL){         printf("打开文件失败！\n");         return 1;     }     while(!feof(fp) && (ch = fgetc(fp)) != '\n') {         if(ch==' '){             column++;         }     }     column++;     if(column==1){         printf("没有数据！\n");         return 1;     }     printf("column=%d\n",column);     fseek(fp,0L,0);     while(!feof(fp)){         if(fgetc(fp)=='\n'){             row++;         }     }     row++;     if(row==1){         printf("没有数据！\n");         return 1;     }     printf("行数=%d\n",row);     A=(double**)malloc(sizeof(double *) * row);     if(A==NULL){         printf("no memory\n");         return 1;     }     for(i=0;i<row;i++)     {         A[i]=(double*)malloc(sizeof(double)*column);         if(A[i]==NULL)         {             printf("no memory\n");             return 1;         }     }     printf("内存分配完成成功1！\n");     fseek(fp,0L,SEEK_SET);     //rewind(fp);     while(!feof(fp)){         for(i=0;i<row;i++){             for(j=0;j<column;j++){                 fscanf(fp,"%lf", &A[i][j]);             }         }     }     printf("读取数据成功1！\n");     printf("A=%.16lf\n", A[0][0]);     printf("A=%.16lf\n", A[2][0]);     system("Pause");     //printf("内存分配完成成功2！\n");     if((op=fopen("rf2_data.txt","r"))==NULL){         printf("打开文件失败！\n");         return 1;     }     printf("代码运行到这！\n");     while(!feof(op)&&(ch=fgetc(op))!='\n'){         if(ch==' '){             column1++;         }     }     column1++;     if(column1==1){         printf("没有数据！\n");         return 1;     }     printf("column1=%d\n",column1);     fseek(op,0L,0);     while(!feof(op)){         if(fgetc(op)=='\n'){             row1++;         }     }     row1++;     if(row1==1){         printf("没有数据！\n");         return 1;     }     printf("行数1=%d\n",row1);     B=(double**)malloc(sizeof(int*)*row1);     if(B==NULL){         printf("no memory\n");         return 1;     }     for(i=0;i<row1;i++)     {         B[i]=(double*)malloc(sizeof(double)*column1);         if(B[i]==NULL)         {             printf("no memory\n");             return 1;         }     }     printf("内存分配完成成功2！\n");     fseek(op,0L,SEEK_SET);     while(!feof(op)){         for(i=0;i<row1;i++){             for(j=0;j<column1;j++){                 fscanf(op,"%lf", &B[i][j]);             }         }     }     printf("B=%.16lf\n",B[0][0]);     printf("读取数据成功2！\n");      //printf("关闭文件！\n");     system("Pause");     //关闭文件     printf("关闭文件！\n");     fclose(fp);     //fclose(op);     //释放内存     for(i=0;i<row;i++){         free(A[i]);         free(B[i]);         //free(B[i]);     }     free(A);     free(B);      return 0;  } 其他地方暂未发现问题，起码如果有数据应该能够读到。 另外，建议提供一下要读文件的内容，我怀疑你读的数据格式和你的处理方式不对。fscanf是格式化读取的，数据之间就没有空格或者其他隔开吗？ 我的数据是用excel转过来的。可能是数据指针那里的问题吧。。除了fscanf还能用其他的么？文件指针是不是有问题？[/quote] 文件指针没问题，如果excel转过来的，那么第一次读之后再次读的时候是不是需要中间隔着一个'\t'呢 所以，你的fscanf每次读都要加一个'\t' fscanf(op,"%lf\t", &B[i][j]); 读到末尾还要改成\n

user: user-0
content: 引用 4 楼 自信男孩的回复: A=(double**)malloc(sizeof(int*)*row); A[i]=(double*)malloc(sizeof(int)*column); 改成：   A=(double**)malloc(sizeof(double*)*row); A[i]=(double*)malloc(sizeof(double)*column); 同理下面的B也需要更改。 第一个对A的申请行数，虽然指针的sizeof都是一样的，建议还要sizeof(double *)， 下面的申请A[i]就必须使用sizeof(double)了。同理B的申请一样。  #include <stdio.h> #include <stdlib.h> #include<math.h> #include<time.h> //#include <conio.h>  int main () {     double**A;     double**B;     FILE *fp;     FILE *op;     int i,j;     //double C[10];/*存放最佳匹配位置的数据*/     char ch;     int row = 0, column = 0;     int row1 = 0,column1 = 0;     //打开文件     if((fp=fopen("rf1_data.txt", "r"))==NULL){         printf("打开文件失败！\n");         return 1;     }     while(!feof(fp) && (ch = fgetc(fp)) != '\n') {         if(ch==' '){             column++;         }     }     column++;     if(column==1){         printf("没有数据！\n");         return 1;     }     printf("column=%d\n",column);     fseek(fp,0L,0);     while(!feof(fp)){         if(fgetc(fp)=='\n'){             row++;         }     }     row++;     if(row==1){         printf("没有数据！\n");         return 1;     }     printf("行数=%d\n",row);     A=(double**)malloc(sizeof(double *) * row);     if(A==NULL){         printf("no memory\n");         return 1;     }     for(i=0;i<row;i++)     {         A[i]=(double*)malloc(sizeof(double)*column);         if(A[i]==NULL)         {             printf("no memory\n");             return 1;         }     }     printf("内存分配完成成功1！\n");     fseek(fp,0L,SEEK_SET);     //rewind(fp);     while(!feof(fp)){         for(i=0;i<row;i++){             for(j=0;j<column;j++){                 fscanf(fp,"%lf", &A[i][j]);             }         }     }     printf("读取数据成功1！\n");     printf("A=%.16lf\n", A[0][0]);     printf("A=%.16lf\n", A[2][0]);     system("Pause");     //printf("内存分配完成成功2！\n");     if((op=fopen("rf2_data.txt","r"))==NULL){         printf("打开文件失败！\n");         return 1;     }     printf("代码运行到这！\n");     while(!feof(op)&&(ch=fgetc(op))!='\n'){         if(ch==' '){             column1++;         }     }     column1++;     if(column1==1){         printf("没有数据！\n");         return 1;     }     printf("column1=%d\n",column1);     fseek(op,0L,0);     while(!feof(op)){         if(fgetc(op)=='\n'){             row1++;         }     }     row1++;     if(row1==1){         printf("没有数据！\n");         return 1;     }     printf("行数1=%d\n",row1);     B=(double**)malloc(sizeof(int*)*row1);     if(B==NULL){         printf("no memory\n");         return 1;     }     for(i=0;i<row1;i++)     {         B[i]=(double*)malloc(sizeof(double)*column1);         if(B[i]==NULL)         {             printf("no memory\n");             return 1;         }     }     printf("内存分配完成成功2！\n");     fseek(op,0L,SEEK_SET);     while(!feof(op)){         for(i=0;i<row1;i++){             for(j=0;j<column1;j++){                 fscanf(op,"%lf", &B[i][j]);             }         }     }     printf("B=%.16lf\n",B[0][0]);     printf("读取数据成功2！\n");      //printf("关闭文件！\n");     system("Pause");     //关闭文件     printf("关闭文件！\n");     fclose(fp);     //fclose(op);     //释放内存     for(i=0;i<row;i++){         free(A[i]);         free(B[i]);         //free(B[i]);     }     free(A);     free(B);      return 0;  } 其他地方暂未发现问题，起码如果有数据应该能够读到。 另外，建议提供一下要读文件的内容，我怀疑你读的数据格式和你的处理方式不对。fscanf是格式化读取的，数据之间就没有空格或者其他隔开吗？ 我的数据是用excel转过来的。可能是数据指针那里的问题吧。。除了fscanf还能用其他的么？文件指针是不是有问题？