c语言读取文件的方法,求教。。。

baidu926 2011-02-21 10:48:05
一个文件server里面的内容是
Domain=29A6DC
OS=Windows 5.1
Server=Windows 2000 LAN Manager
E$# Disk
testfile# Disk
D$# Disk
ADMIN$# Disk
C$# Disk
(Called name not present)//这两行数据不处理
(Called name not present)//这两行数据不处理
Domain=29A6DC
OS=Windows 5.1
Server=Windows 2000 LAN Manager

我想定义一个结构体,读取前三行和后三行做对比。。。。然后再读取
E$# Disk
testfile# Disk
D$# Disk
ADMIN$# Disk
C$# Disk
这些倒结构中的一个数组中
我试了用fgets来读取没有成功。。。。。高手能给小弟先讲下思路吗。。。
...全文
1957 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
朝阳祥和 2012-02-27
  • 打赏
  • 举报
回复
fgets
语法:
#include <stdio.h>
char *fgets( char *str, int num, FILE *stream );



函数fgets()从给出的文件流中读取[num - 1]个字符并且把它们转储到str(字符串)中. fgets()在到达行末时停止,在这种情况下,str(字符串)将会被一个新行符结束. 如果fgets()达到[num - 1]个字符或者遇到EOF, str(字符串)将会以null结束.fgets()成功时返回str(字符串),失败时返回NULL.

noteboom 2011-02-22
  • 打赏
  • 举报
回复
1.存在那么个文件
如果没有在main函数里一个server,最省力的办法是写个txt复制到相关c源程序所在的目录中

2.经验证此段代码可以读取 前三行 也可以读取后三行。 如法炮制即可。

3.换个花样就成结构体了

#include<stdio.h>
void qian3(char k[][40]);
void hou3(char k[][40]);

main()
{char k[6][40];

qian3(k);
hou3(k);


}

void qian3(char k[][40])
{FILE *fp;
int i;

fp=fopen("server.txt","r");
fgets(k[0],39,fp);
fgets(k[1],39,fp);
fgets(k[2],39,fp);
fclose(fp);
for(i=0;i<3;i++)
puts(k[i]);


}

void hou3(char k[][40])
{FILE *fp;
int i=0;
fp=fopen("server.txt","r");
while(i<10)
if(getc(fp)=='\n')i++;

fgets(k[3],39,fp);
fgets(k[4],39,fp);
fgets(k[5],39,fp);

fclose(fp);
for(i=3;i<6;i++)
puts(k[i]);

}
赵4老师 2011-02-22
  • 打赏
  • 举报
回复
fgets的第二个参数是设置能读取的最大长度,不是需要读的长度。
如果完整读入了一行文本,fgets读入的内容后面有'\n',否则就是该行超过了刚才设置的最大长度,此时可以再接着读取剩下未读部分。
noteboom 2011-02-22
  • 打赏
  • 举报
回复
程序得出结果的前提,存在server文件。如果不存在可以写个server文件,复制到c源程序相关文件目录中。
也可以在程序中直接write一个server。本代码采用第一种办法。
经过验证,成功读取前3行和后3行。
说明,第一次发的那个代码也是正确的。为了不引起不必要的思考,将40改为39
#include<stdio.h>
void qian3(char k[][39]);
void hou3(char k[][39]);

main()
{char k[6][39];

qian3(k);
hou3(k);


}

void qian3(char k[][39])
{FILE *fp;
int i;

fp=fopen("server.txt","r");
fgets(k[0],39,fp);
fgets(k[1],39,fp);
fgets(k[2],39,fp);
fclose(fp);
for(i=0;i<3;i++)
puts(k[i]);


}

void hou3(char k[][39])
{FILE *fp;
int i=0;
fp=fopen("server.txt","r");
while(i<10)
if(getc(fp)=='\n')i++;

fgets(k[3],39,fp);
fgets(k[4],39,fp);
fgets(k[5],39,fp);

fclose(fp);
for(i=3;i<6;i++)
puts(k[i]);

}
赵4老师 2011-02-22
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 noteboom 的回复:]
1.存在那么个文件
如果没有在main函数里一个server,最省力的办法是写个txt复制到相关c源程序所在的目录中

2.经验证此段代码可以读取 前三行 也可以读取后三行。 如法炮制即可。

3.换个花样就成结构体了

#include<stdio.h>
void qian3(char k[][40]);
void hou3(char k[][40]);

main(……
[/Quote]
请将39替换为40.因为MSDN中是这样的
Get a string from a stream.

char *fgets( char *string, int n, FILE *stream );


Remarks

The fgets function reads a string from the input stream argument and stores it in string. fgets reads characters from the current stream position to and including the first newline character, to the end of the stream, or until the number of characters read is equal to n – 1, whichever comes first. The result stored in string is appended with a null character. The newline character, if read, is included in the string.

noteboom 2011-02-21
  • 打赏
  • 举报
回复
明天给你整个代码
fengzhw 2011-02-21
  • 打赏
  • 举报
回复
如果数据文本行一板一眼的,该多少行就多少行,那fgets不可能有问题,
一行fgets代码对应文本的一行文本挨个处理就是了;

略微复杂一些的是一些可选的内容和不确定的重复,
你需要管理一个数据读入状态:
 初始->DOMAIN->OS->SERVER->可选部分->DOMAIN。
根据读入状态,重点分析应该读入什么,以及遇到意外数据要变换到什么状态下。

一般而言,状态机是分析日常问题处理策略的一种有效思路,也是常用的编程思路;
noteboom 2011-02-21
  • 打赏
  • 举报
回复
要想读到最后三行,
首先解决的问题是
将位置指针移到倒数第三行行首。
我的办法时用fgetc函数读取字符,一个个判断。
justkk 2011-02-21
  • 打赏
  • 举报
回复
前3行好读
后3行还真不好读
可以先全部读一遍,计算文件行数
chenbin200818 2011-02-21
  • 打赏
  • 举报
回复
不建议如此做 太麻烦了, 应该接合脚本处理
dooX8086 2011-02-21
  • 打赏
  • 举报
回复
方法很多..用fgets一行行读也可以(虽然麻烦点 :P)
你代码中的
struct stu
{
char name[30];
char os[30];
char server[40];
char *disk[5]; // 这只是一个 char* 的数组并没有 "空间", 使用前需要初始化---也可以使用二维 char disk[5][50];
int cont;
}str;


//...

for(i=0;i<5;i++)
{
str.disk[i] = (char *)calloc(50, sizeof(char)); //分配内存, 如使用char disk[5][50]这里就不需要分配内存
fgets(str.disk[i],50,fp);
printf("\n%s",str.disk[i]);
}

// 接着就是后面的数据
char tmp[50];
// 跳过两行
fgets(tmp, 50, fp);
fgets(tmp, 50, fp);

//...读后三行.
//...
// 记得 free()


// 对于这种数据,我多数会用 scanf 系列来完成
baidu926 2011-02-21
  • 打赏
  • 举报
回复
#include "stdio.h"

struct stu
{
char name[30];
char os[30];
char server[40];
char *disk[5];
int cont;
}str;


void main()
{
char filename[30]={"c:\\server.txt"};
int i=0;
FILE *fp;
if((fp=fopen(filename,"r"))==NULL)
{
printf("error");
}
else
printf("yijingdakaiwenjian");

fgets(str.name,sizeof(str.name),fp);
printf("\n%s",str.name);

fgets(str.os,sizeof(str.os),fp);
printf("\n%s",str.os);

fgets(str.server,sizeof(str.server),fp);
printf("\n%s",str.server);

for(i=0;i<5;i++)
{
fgets(str.disk[i],50,fp);
printf("\n%s",str.disk[i]);
}
}
我已经读完了前面的三行接着后面的就读不出来了,老是出错。。。
还是最后三行还真的没想到办法能读到。。。
noteboom 2011-02-21
  • 打赏
  • 举报
回复
定义一个结构体。
用fgets读取前三行,fgets遇到换行即停止读入,但是包含读入的\n。

用getc读取字符,
读到倒数第三行前一个换行符时,(此时位置指针在第三行行首)
用fgets读取后三行。
欣客 2011-02-21
  • 打赏
  • 举报
回复
可以一行一行的读,当读到不该读的行数,跳过不处理。
sun007700 2011-02-21
  • 打赏
  • 举报
回复
fread 加 "\r\n"或者"\n"换行符的判断。

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧