2021-04-07(文件操作)

文件寫入

char str[29]="hello 2021";
FILE *fp//打開文件
fp=fopen("123.txt","w");//讀寫文件
fprintf(fp,"%s",str)//寫
fclose(fp);
return 0;

文件讀取

include<stdio.h>

int main()
{
char str2[200];
FILE *fp;//打開文件
fp=fopen("123.txt","r");//讀寫文件
fscanf(fp,"%s",str2);
printf("%s\n",str2);
fclose(fp);
return 0;
}


讀字符串函數(shù) fgets

fgets() 函數(shù)用來從指定的文件中讀取一個字符串,并保存到字符數(shù)組中,它的用法為:

char *fgets ( char *str, int n, FILE *fp );

str 為字符數(shù)組,n 為要讀取的字符數(shù)目,fp 為文件[指針]

返回值:讀取成功時返回字符數(shù)組首地址,也即 str;讀取失敗時返回 NULL;如果開始讀取時文件內(nèi)部指針已經(jīng)指向了文件末尾,那么將讀取不到任何字符,也返回 NULL。

注意,讀取到的字符串會在末尾自動添加 '\0',n 個字符也包括 '\0'。也就是說,實際只讀取到了 n-1 個字符,如果希望讀取 100 個字符,n 的值應(yīng)該為 101。例如:

define N 101

char str[N];
FILE *fp = fopen("D:\demo.txt", "r");
fgets(str, N, fp);
表示從 D:\demo.txt 中讀取 100 個字符,并保存到字符數(shù)組 str 中。

需要重點說明的是,在讀取到 n-1 個字符之前如果出現(xiàn)了換行,或者讀到了文件末尾,則讀取結(jié)束。這就意味著,不管 n 的值多大,fgets() 最多只能讀取一行數(shù)據(jù),不能跨行。在C語言中,沒有按行讀取文件的函數(shù),我們可以借助 fgets(),將 n 的值設(shè)置地足夠大,每次就可以讀取到一行數(shù)據(jù)。

一行一行讀取文件

include <stdio.h>

include <stdlib.h>

define N 100

int main(){
FILE *fp;
char str[N+1];
if( (fp=fopen("d:\demo.txt","rt")) == NULL ){
puts("Fail to open file!");
exit(0);
}

while(fgets(str, N, fp) != NULL){
    printf("%s", str);
}

fclose(fp);
return 0;

}
fgets() 遇到換行時,會將換行符一并讀取到當(dāng)前字符串。該示例的輸出結(jié)果之所以和 demo.txt 保持一致,該換行的地方換行,就是因為 fgets() 能夠讀取到換行符。而 gets() 不一樣,它會忽略換行符。
寫字符串函數(shù) fputs
fputs() 函數(shù)用來向指定的文件寫入一個字符串,它的用法為:
int fputs( char *str, FILE *fp );
str 為要寫入的字符串,fp 為文件指針。寫入成功返回非負(fù)數(shù),失敗返回 EOF。例如:
char *str = "http://c.biancheng.net";
FILE *fp = fopen("D:\demo.txt", "at+");
fputs(str, fp);


動態(tài)內(nèi)存開辟

//堆空間 ??臻g 全局/靜態(tài)區(qū)

include<stdio.h>

include<string.h>

include<stdlib.h>

int main()
{
char *p;
p=(char *)malloc(100);
strcpy(p,"nice to meet you!");
puts(p);
return 0;


int *s;
s=(int *)malloc(4);
*s=1234;
printf("%d\n",*s);
return 0;

free(p);
free(s);
//釋放空間
}


病毒樣例
char p;
int i=0;
while(i<1000)
{
p=malloc(1024
1024);
Sleep(200);
i++;
}


int i=0;
int j=0;
int p1,p2;
char a[100000];
p1=malloc(100);
p2=malloc(100);
printf("%x%x\n",&i,&j);

image.png

free()要釋放的,不然內(nèi)存泄露會越來越大直到崩潰


堆 棧 區(qū)別


有N個學(xué)生,每個學(xué)生的數(shù)據(jù)包括學(xué)號、姓名、3門課的成績,從鍵盤輸入N個學(xué)生的數(shù)據(jù),要求打印出3門課的總平均成績,以及最高分的學(xué)生的數(shù)據(jù)(包括學(xué)號、姓名、3門課成績)
輸入
學(xué)生數(shù)量N占一行每個學(xué)生的學(xué)號、姓名、三科成績占一行,空格分開。
輸出
各門課的平均成績 最高分的學(xué)生的數(shù)據(jù)(包括學(xué)號、姓名、3門課成績)
樣例輸入
2
1 blue 90 80 70
b clan 80 70 60
樣例輸出
85 75 65
1 blue 90 80 70


#include<stdio.h>
typedef struct student {
    char num[100];
    char name[100];
    int grade[3];
}stu[100];

int main()
{
    int a, i, u;
    int sum[100], average[100], number = 0, max = 0, d;
    scanf("%d", &a);
    struct student stu[100];
    for (i = 0;i < a;i++)
    {
        scanf("%s %s %d %d %d", stu[i].num, stu[i].name, &stu[i].grade[0], &stu[i].grade[1], &stu[i].grade[2]);
    }
    for (i = 0;i < a;i++)
    {
        sum[i] = stu[i].grade[0] + stu[i].grade[1] + stu[i].grade[2];
    }
    for (i = 0;i < 3;i++)
    {
        d = 0;
        for (u = 0;u < a;u++)
        {
            d = d + stu[u].grade[i];
        }
        average[i] = d / a;
        printf("%d ", average[i]);
    }
    printf("\n");
    for (i = 0;i < a;i++)
    {
        if (max <= sum[i])
        {
            max = sum[i];
            number = i;
        }
    }
    printf("%s %s %d %d %d", stu[number].num, stu[number].name, stu[number].grade[0], stu[number].grade[1], stu[number].grade[2]);
}






最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容