fopen fwrite fread問題小記

2839 ワード

テストコード(テスト環境ubuntu+gcc):
#include 
#include 

struct que_st1 {
	int a;
	int b;
	int c;
	char buf[100];
}str1;

struct que_st2 {
	int a;
	int b;
	int c;
	char buf[1000];
}str2;

//   1,      ,    ,    
//fopen: No such file or directory
//len=0
//str2=0 0 0, 0
//Segmentation fault (core dumped)

int main()
{
	FILE *fp = NULL;
	size_t len;
	
	str1.a = 100;
	str1.b = 200;
	str1.c = 300;
	str1.buf[99] = 99;
	
//	fp = fopen("/home/wy/ctyq/ctyq_mini/save.ty", "w+");
//	len = fwrite(&str1, sizeof(str1), 1, fp);
//	printf("len=%d
", len); // fclose(fp); fp = fopen("/home/wy/ctyq/ctyq_mini/save.ty", "r+"); if (fp == NULL) { perror("fopen"); } printf("len=%d
", len); printf("str2=%d %d %d, %d
", str2.a, str2.b, str2.c, str2.buf[99]); len = fread(&str2, sizeof(str2), 1, fp); printf("len=%d
", len); printf("str2=%d %d %d, %d
", str2.a, str2.b, str2.c, str2.buf[99]); fclose(fp); system("rm -rf save.ty"); } // 2, , , //len=1 //len=0 //str2=100 200 300, 99 int main() { FILE *fp = NULL; size_t len; str1.a = 100; str1.b = 200; str1.c = 300; str1.buf[99] = 99; fp = fopen("/home/wy/ctyq/ctyq_mini/save.ty", "w+"); len = fwrite(&str1, sizeof(str1), 1, fp); printf("len=%d
", len); fclose(fp); fp = fopen("/home/wy/ctyq/ctyq_mini/save.ty", "r+"); if (fp == NULL) { perror("fopen"); } len = fread(&str2, sizeof(str2), 1, fp); printf("len=%d
", len); printf("str2=%d %d %d, %d
", str2.a, str2.b, str2.c, str2.buf[99]); fclose(fp); system("rm -rf save.ty"); } // 3, , , //lenw=112 //lenr=112 //str2=100 200 300, 99 int main() { FILE *fp = NULL; size_t len; str1.a = 100; str1.b = 200; str1.c = 300; str1.buf[99] = 99; fp = fopen("/home/wy/ctyq/ctyq_mini/save.ty", "w+"); len = fwrite(&str1, 1, sizeof(str1), fp); printf("lenw=%d
", len); fclose(fp); fp = fopen("/home/wy/ctyq/ctyq_mini/save.ty", "r+"); len = fread(&str2, 1, sizeof(str2), fp); printf("lenr=%d
", len); printf("str2=%d %d %d, %d
", str2.a, str2.b, str2.c, str2.buf[99]); fclose(fp); }

以上のコードおよび実行結果に基づいて、注意事項が必要です.
1、fopen操作の戻り値は、ファイルがないか、ファイルを作成できないため、fwriteまたはfread操作にセグメントエラーが発生しないように判断しなければならない.
2、fread読み取りユニットがファイルサイズを超えた場合、戻り値は0になります.この場合、実際に受信ユニットstr 2は、すでに値が割り当てられているので、異常が発生しないように注意してください.
3、補足説明2、以下の2つの書き方に注意してください.ファイルの実際の体積が読み取り体積より小さい場合、書き方2は0を返しますが、実際にはstr 2は一部付与されています.
fread(&str2, 1, sizeof(str2), fp);
fread(&str2, sizeof(str2), 1, fp);