小豬的C語言快速入門系列(八)
小豬的C語言快速入門系列(八)
標籤: C語言
本節引言:
本節講解的是C語言中的位運算與檔案,相信這兩章對於部分童鞋來說是陌生的,
因為很多大學的老師都會選擇跳過這兩個知識點,其實這兩個知識點也是非常
重要的,比如位運算,比如讓你算a*2,怎麼寫效率(裝逼)高,如果你會位運算
你會 a<<1,效率可比a*2高哦,另外一個常見的問題,怎麼不使用中間值
變數交換兩個變數的值?而檔案操作的重要性也不用說吧,一般期末都會讓你
做一個xx管理系統之類的東東,存取檔案基本是必不可少的!
本節學習路線圖
位運算
Tips:
位運算子並不改變自身的值,如果你想要改變自身的值,可以在運算子的後面
加上等號: a &= b; 等價於 a = a & b;
檔案
1.文字檔案的使用方式
讀寫字元 | 作用 |
---|---|
“r” | 只讀方式開啟一個文字檔案,只允許度資料,不存在則開啟失敗 |
“w” | 只寫方式開啟或建立一個文字檔案,只允許寫資料 |
“a” | 追加的方式開啟一個文字檔案,可在檔案尾寫資料,不存在則建立一個 |
“r+” | 讀寫方式開啟一個文字檔案,允許讀寫,不存在,開啟失敗 |
“w+” | 讀寫方式開啟或建立一個文字檔案,允許讀寫 |
“a+” | 讀寫方式開啟文字檔案,在檔案末尾追加資料,不存在則建立一個 |
2.檔案詳細學習圖
3.使用程式碼示例
- 單個字元寫入(
fputc()
)/讀取(fgetc()
)
#include <stdio.h>
#include <string.h>
int main()
{
FILE *fp;
char str[] = "Write The Data to File!";
int index = 0;
fp = fopen("test1.txt","w");
if(fp == NULL)
{
printf("檔案開啟失敗!\n");
exit(1);
}
//因為是一個個字元輸入的,所以要獲得長度
while(index < strlen(str))
fputc(str[index++],fp);
fclose(fp);
return 0;
}
#include "stdio.h"
int main()
{
FILE *fp;
char c;
int n = 1;
if((fp = fopen("test1.txt","r")) == NULL)
{
printf("檔案開啟失敗!\n");
exit(1);
}
//EOF是檔案結尾的標誌,此處是判斷是否到檔案尾
while((c = fgetc(fp)) != EOF)
{
printf("%c",c);
n++;
}
printf("\n");
fclose(fp);
return 0;
}
執行結果:
PS:如果不寫完整路徑的話,比如:d:\\c_code\\day 8
的話,會在程式碼所在的
目錄下生成對應的檔案。
- 讀(
fgets()
)寫(fputs()
)一個字串
/*
fputs(字串,fp)
作用:向fp所指的檔案中,將字串寫入,'\0'並不寫入!
*/
#include <stdio.h>
int main()
{
char str[] = "通過fputs方法往檔案中寫入資訊!";
FILE *fp = fopen("test2.txt","w");
if(fp == NULL)
{
printf("檔案開啟失敗!\n");
exit(1);
}
fputs(str,fp);
fclose(fp);
return 0;
}
/*
fgets(字串陣列,n,檔案指標)
就是:從fp執指向的檔案中讀取一個長度為n - 1的字串,
儲存在一維字元陣列中,因為字串會預設新增一個'\0'
*/
#include <stdio.h>
int main()
{
FILE *fp;
char str[20];
if((fp = fopen("test2.txt","r")) == NULL)
{
printf("檔案開啟失敗!\n");
exit(1);
}
//這裡寫3是因為,漢字是佔2個位元組的
while(fgets(str,3,fp) != NULL)
printf("%s",str);
printf("\n");
fclose(fp);
return 0;
}
執行結果:
- 格式化讀(
fprintf
)寫(fscanf
)函式
這個和前面學的scanf和printf使用方法是一樣的,不過前者們
是針對記憶體中的資料的!而後者是針對檔案讀寫的,fprintf是
將控制檯的內容列印到檔案中,所以是寫入,fscanf則是將
檔案的內容輸入到控制檯,所以是讀取。
#include <stdio.h>
int main()
{
char c[] = "Today is 2014 July ";
int day = 22;
char a = 't',b = 'h';
FILE *fp;
if((fp = fopen("test3.txt","w"))== NULL)
{
printf("檔案開啟失敗!\n");
exit(1);
}
fprintf(fp,"%s%d %c%c",c,day,a,b);
fclose(fp);
return 0;
}
#include <stdio.h>
int main()
{
//這裡很容易出問題,所以我並不喜歡用fscanf這個函式
char c1[5],c2[5],c3[5],c4[5],c5[5],c6[5];
int day,year;
FILE *fp;
if((fp = fopen("test3.txt","r"))== NULL)
{
printf("檔案開啟失敗!\n");
exit(1);
}
//這個要按照讀取的檔案的格式寫,我弄了N久還是不行
//就直接用6個字串了...
fscanf(fp,"%s%s%s%s%s%s",&c1,&c2,&c3,&c4,&c5,&c6);
printf("%s %s %s %s %s %s\n",c1,c2,c3,c4,c5,c6);
fclose(fp);
return 0;
}
執行結果:
- 二進位制檔案的讀寫
資料塊方式寫入(fwrite()
)與讀取(fread()
)
程式碼示例:
將學生資訊儲存到結構體中,然後通過fwrite()函式將結構體內容寫入檔案中;
在通過fread()函式讀取出來
#include <stdio.h>
typedef struct
{
int id;
char name[20];
int age;
}STU;
int main()
{
STU stu;
FILE *fp;
char c;
//內容是追加的!
if((fp = fopen("test4.data","ab"))== NULL)
{
printf("檔案開啟失敗!\n");
exit(1);
}
//錄入多個學生的資訊:
while(1)
{
printf("請輸入學號: ");scanf("%d",&stu.id);
printf("\n請輸入姓名: ");scanf("%s",&stu.name);
printf("\n請輸入年齡: ");scanf("%d",&stu.age);
//引數依次是: 資料起始地址,每次寫入的資料塊的位元組數,資料塊的數目,檔案指標
fwrite(&stu,sizeof(stu),1,fp);
printf("\n繼續輸入?(Y/N)\n");
getchar();
c = getchar();
if(c == 'y' || c == 'Y')continue;
else break;
}
fclose(fp);
return 0;
}
#include <stdio.h>
typedef struct
{
int id;
char name[20];
int age;
}STU;
int main()
{
STU stu;
FILE *fp;
if((fp = fopen("test4.data","rb"))== NULL)
{
printf("檔案開啟失敗!\n");
exit(1);
}
//讀取儲存的學生資訊
printf("輸出檔案中的內容:\n");
printf("學生學號 學生姓名 學生年齡\n");
//從fp指向的二進位制檔案讀取資料,每次讀取大小為size個位元組的資料
//執行 1 次;最後將這些資料儲存到結構體變數的地址記憶體中
//返回值正常時是讀取的資料庫個數(count)的值,否則返回0(錯誤或檔案尾)
while(fread(&stu,sizeof(stu),1,fp) == 1)
{
printf("%-15d%-15s%-15d\n",stu.id,stu.name,stu.age);
}
fclose(fp);
return 0;
}
輸出結果:
字寫入(putw(n,fp)
)/讀取(getw(fp)
)函式
getw與putw兩個函式並不是ANSI C標準定義的函式,但很多C語言編譯系統都有
提供這兩個函式,如果沒有提供也可以自己寫,這個用得不多,就不給出具體
程式碼示例了,只給出函式的用法介紹。
- putw(n,fp):以二進位制的形式將一個int型別的資料寫入到fp所指向的
二進位制檔案中! n為寫入的整數,執行正常返回寫入的整數,否則返回EOF - getw(fp):從fp指向的二進位制檔案中以二進位制的方式讀取一個字
執行正常返回所讀取的二進位制整數,否則返回EOF
本文連結:小豬的C語言快速入門系列(八)
作者:Coder-Pig
出處:http://blog.csdn.net/coder_pig
本文基於知識共享署名-相同方式共享 4.0 國際許可協議釋出,歡迎轉載,
演繹或用於商業目的,但是必須保留本文的署名及連結。åç
相關文章
- 小豬的C語言快速入門系列(一)C語言
- 小豬的C語言快速入門系列(二)C語言
- 小豬的C語言快速入門系列(三)C語言
- 小豬的C語言快速入門系列(四)C語言
- 小豬的C語言快速入門系列(五)C語言
- 小豬的C語言快速入門系列(六)C語言
- 小豬的C語言快速入門系列(七)C語言
- 小豬的C語言快速入門系列(九)C語言
- 【Go語言入門系列】(八)Go語言是不是面嚮物件語言?Go物件
- C++語言菜鳥快速入門C++
- Flutter小白教程系列(三) --- Dart語言快速入門FlutterDart
- R語言快速入門R語言
- Go語言快速入門Go
- Groovy 語言快速入門
- Swift語言快速入門Swift
- c語言入門C語言
- 如何快速入門一門語言
- go語言快速入門教程Go
- SQL語言快速入門(轉)SQL
- C語言快速入門教程1快速入門 2指令 3條件選擇C語言
- GO 語言快速開發入門Go
- C語言入門基礎C語言
- golang 快速入門 [3]-go 語言 helloworldGolang
- 自然語言處理NLP快速入門自然語言處理
- Go語言快速入門筆記01Go筆記
- Lua 語言 15 分鐘快速入門
- Go語言程式設計快速入門Go程式設計
- 幾十種程式語言的快速入門教程
- 《C 語言入門教程》釋出了
- Rust入門系列之語言特性 - 1Rust
- C語言程式設計入門經典18個小程式C語言程式設計
- Go語言入門系列(四)之map的使用Go
- golang 快速入門 [1]-go 語言導論Golang
- Dart語言——45分鐘快速入門(下)Dart
- Dart語言——45分鐘快速入門(上)Dart
- Golang語言檔案操作快速入門篇Golang
- [C語言] 第一章|C語言入門第一課C語言
- C語言入門很簡單pdfC語言