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