c语言写入文件方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言写入文件方法相关的知识,希望对你有一定的参考价值。

文件操作
2、假设有文件C:\f11.txt,其中保存着一批学生的3门考试成绩,第一个数据为学号,每位学生一行,格式如下:
001 67.5 86.5 33
002 90 98 66
003 60 69 80
……
编写程序实现功能:
a、 把这个文件的全部数据复制到新文件C:\f11a.txt中去,在C:\f11a.txt中每位学生的3门成绩后面增加一项平均成绩,5项数据之间用制表符或者空格符分隔。
b、 接收用户从键盘输入的学号,查询文件C:\f11a.txt,找到和用户输入学号相同的一行学生信息,并且输出该行学生信息。

这是我编写的代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct student

int unsigned id;
float score [3];
float rank;
Student;

int main ()

Student s;
FILE * fp;
fp=fopen("C:\\f11.txt","r+");
if (!fp)

printf("file cannot be opened");
exit(1);

fscanf(fp,"%03d%f%f%f",&s.id,&s.score[0],&s.score[1],&s.score[2]);
//fprintf(stdout,"%g",s.score[2]);
FILE * fw;
fw=fopen("c:\\f11a.txt","wb+");
if (!fw)

printf("file cannot be opened");
exit(1);


while(!feof(fp))

s.rank=(s.score[0]+s.score[1]+s.score[2])/3;
fwrite(&s,sizeof(s),1,fw);
fscanf(fp,"%03d%f%f%f",&s.id,&s.score[0],&s.score[1],&s.score[2]);


fclose (fp);
fclose(fw);
return 0;


重新打开f11a.txt文件并不是所要的类型,求大神帮我修改完成!
我真想杀了二楼,学号的我改了,不过转成char总行吧,路又不是死的。。。说那么多废话。。

要写入文件,可以按照以下步骤进行操作:
1 在代码中引用stdio.h,即
#include <stdio.h>
C语言的所有文件操作接口,均声明在这个头文件中。
2 定义FILE *类型的变量。
3 打开文件,使用函数为fopen。格式为:
FILE *fopen(char *filename, char *mode);
参数filename为要写入的文件名,mode为打开的方式,如果仅需写入文件,可以使用"w"或
"wb"。
返回值为文件指针类型,赋值给之前定义的变量。如果返回值为NULL,代表打开失败,无法写入。
4 对文件进行写操作。C语言中有很多写文件的接口,包括fprintf, fwrite, fputs, fputc等等。
写操作可以执行多次。
5 在全部写操作完成后,执行fclose函数关闭文件指针。这样就实现了C语言写入文件。
参考技术A 哥们,给分吧!要快!!!
第一、你的结构体设计得有问题。
因为你的学号不是int, 是char*,OK?
应该改成:
typedef struct student

char id[3];
float score [3];
float rank;
Student;

第二、如何正确从文件读取数据
按照你的文件格式,把数据读入结构体,其实很简单
int main ()

Student s;
FILE * fp;
fp=fopen("1.txt","r");
if (!fp)

printf("file cannot be opened");
exit(1);

fscanf(fp,"%s%f%f%f\n",s.id,&s.score[0],&s.score[1],&s.score[2]);
printf("%s %f %f %f\n",s.id,s.score[0],s.score[1],s.score[2]);


第三、到这里,你的所有问题都已经解决了
我上面提到的两点,你理解了,其实你说的问题就解决了,Right?记住:关键是要把学号看成char*

结贴吧追问

我说的是如何把结构体的内容写入文件!你说反了,这么大的标题—-—。先把id换成char试试,不过依旧不能给你分。

追答

同学,你这样的态度就不大好,咱们既然来给你看问题,肯定是仔细看过了,你把读文件的功能实现了吗????嘿嘿,如果你理解了,写文件你会做不了???!!!
提问题要谦虚一点,你以为BAIDU的分是$啊!!!哈哈

追问

如果我真会了,还用问吗。。。分给你我眼就瞎了。。。

追答

好吧,同学,我的代码你只管拿去用,你的分数下次还可以接着用,呵呵。
还有,你的学号是以0开头的,如果用int能读到001,那我服了!!!
同学,你太可爱了,如果你是女生,我非娶了你不可!!!

参考技术B 我是南邮的呀、果断把分给我对吧
程序应该是%¥#@*&)*……&)……
&……¥(&……¥&……¥(*(*(&
……&%¥R^&$&*$&*&%*(&%*(*(%
……&¥R&*$(&%$*(&%*(%(*%
&……¥(&……¥&……¥(*(*(&
……&%¥R^&$&*$&*&%*(&%*(*(%
……&¥R&*$(&%$*(&%*(%(*%&……¥(&……¥&……¥(*(*(&
……&%¥R^&$&*$&*&%*(&%*(*(%
……&¥R&*$(&%$*(&%*(%(*%

这段是核心代码 以下省略10000字追问

死边边去,别丢人。。。

参考技术C 程序注意的一点,二进制和文本形式的读取区别你需要巩固,读的文件就不要以读写形式打开,养成一个好的习惯。
另外一个不太重要的一点,id确实很少作为int类型的,因为有些id会很长,比如10位20位,这样int就存不下了,而用char数组存的话只需要10个字节20个字节就能存下,对于每一位也好比较。
#include <stdio.h>
#include <stdlib.h>
typedef struct student

int unsigned id;
float score [3];
float rank;
Student;

int main ()

Student s;
FILE * fp;
fp=fopen("C:\\f11.txt","r"); //尽量以可读方式打开
if (!fp)

printf("file cannot be opened");
exit(1);

//fscanf(fp,"%d %f %f %f",&s.id,&s.score[0],&s.score[1],&s.score[2]); 这一行拿到下面while语句里面
//fprintf(stdout,"%g",s.score[2]);
FILE * fw;
fw=fopen("C:\\f11a.txt","w"); //注意wb是以2进制形式打开文件,还有目录的格式
if (!fw)

printf("file cannot be opened");
exit(1);


while(!feof(fp))

fscanf(fp,"%03d%f%f%f",&s.id,&s.score[0],&s.score[1],&s.score[2]);
s.rank=(s.score[0]+s.score[1]+s.score[2])/3;
fprintf(fw,"%03d\t%.1f\t%.1f\t%.1f\t%.1f\n", s.id, s.score[0], s.score[1], s.score[2], s.rank); //尤其注意fprintf和fwrite不同,fwrite是以二进制形式写文件,如果用fwrite的话将会显示乱码,fwrite和fread配套,fscanf和fprintf配套


fclose (fp);
fclose(fw);
return 0;
本回答被提问者和网友采纳
参考技术D 对于学号来说int 或是char的影响不是很大,没关系
至于读取数据方面我同意二楼的解释

c++文件怎么从文件中读出和写入字符串?

其实我是想问

谁能告诉我怎么编写这个程序:

从文件“file1.txt”中读出一串包含若干数字和英文字母的字符串,将其中的数字字符挑选出来,
并将他们按由小到大的顺序存入文本文件“filenum.txt”中

急求啊,答的快又好的有100分的加分!!!!
说详细点好吗````

一般来说在C++语言中读取txt文件的信息有三种方法:

1、使用C语言标准文件I/O中的fopen()、fread()等等函数。示例如下(vc6.0下编译通过):

#include<stdio.h>
FILE*stream;
void main(void)

long l;
float fp;
char s[81];
char c;
 
stream=fopen("fscanf.out","w+");
if(stream==NULL)
printf("Thefilefscanf.outwasnotopened\\n");
else

fprintf(stream,"%s%ld%f%c","hello world",  
65000,3.14159,\'x\');
/*Setpointertobeginningoffile:*/
fseek(stream,0L,SEEK_SET);
/*Readdatabackfromfile:*/
fscanf(stream,"%s",s);
fscanf(stream,"%ld",&l);
fscanf(stream,"%f",&fp);
fscanf(stream,"%c",&c);
/*Outputdataread:*/
printf("%s\\n",s);
printf("%ld\\n",l);
printf("%f\\n",fp);
printf("%c\\n",c);
fclose(stream);

2、使用C++语言中的文件I/O中的ofstream,ifstream,fstream。示例如下(vc6.0下编译通过):

    #include <iostream>
    #include <fstream>
    #include <cstdlib>
      using namespace std;
    
    int main () 
        char buffer[256];
        ifstream in("test.txt");
        if (! in.is_open())
         cout << "Error opening file"; exit (1); 
        while (!in.eof() )
        
            in.getline (buffer,100);
            cout << buffer << endl;
        
        return 0;
    

3、使用操作系统中的API函数,比如Windows上的ReadFile()、OpenFile()等等,现在操作系统一般都具备内存文件映射功能,对于大的txt文件,一般都使用这种方式操作。 

参考技术A FILE *fin=freopen("input.txt","r",stdin);
FILE *fout=freopen("outfile.txt","w",stdout);
加上这个就和普通的命令行下读写一样了。。你可以尝试一下,如果都加上就是文件读写,在控制台就看不到信息的
你可以把input.txt 改成file1.txt然后再处理
参考技术B #include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main()

ifstream input;
input.open("file1.txt");
if (input.fail())

cout<<"open the file error!\n";
exit(1);


string str;
if (input>>str)//输入串

int len = str.length();
string result;
int count = 0;
int i;
for (i = 0; i < len; i++)

if (isdigit(str[i]))//判断串里的数字

result += str[i];
count++;



int k;
int temp;

for (i = 0; i < count -1; i++)//排序

k = i;
for (int j = i+1; j < count; j++)

if (result[j] < result[k])

k = j;



if (k != i)

temp = result[k];
result[k] = result[i];
result[i] = temp;




ofstream output;
output.open("filenum.txt");
if (output.fail())

cout<<"open file error!\n";
exit(1);


output<<result<<endl;
output.close();


input.close();

return 0;

本回答被提问者采纳
参考技术C 对任意输入的字符串,将其按照指定的次数插入到指定的文件中 参考技术D 你打开有误哦! 可可

以上是关于c语言写入文件方法的主要内容,如果未能解决你的问题,请参考以下文章

C语言二进制流写入文件

C语言如何以插入方式写入文件

C语言写入文件,文件操作

C语言中如何将一个数组导入到文件中?

C语言 把二维数组写入文件?

C语言将数据写入文件,读取出现二次读取