我正在尝试编写一个给出一些文本文件的函数,它会返回一些特定的行。但问题是其中一些不打印。
我使用fgets(var,1500,(file *)fp)从文件中获取每一行,然后使用printf打印它。
文件内容如下:
收件人:马克
来自:Bob
ID:0
Sun Feb 5 13:21:38 2017
主题:足球
文字:下周六上午
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void listmails(){
char To[300];
char From[300];
char Date[1500];
char Subject[300];
char ID[300];
char Text[300];
char llegible[500];
int countkong = 0;
FILE *fp;
while (countkong != -1 ){
sprintf(llegible, "%d_EDA1_email.txt", countkong); // files name are of the type 0_EDA1_email.txt, 1_EDA1_email.txt...
fp = fopen(llegible, "r");
countkong ++;
if(fp!=NULL){
fgets(To, 300, (FILE*)fp); // I don't want to do nothing wit this line, only to jump to the next line of the file
fgets(From, 300, (FILE*)fp);
printf("%s\n", From);
fgets(ID, 300, (FILE*)fp);
printf("%s\n", ID);
fgets(Date, 1500, (FILE*)fp);
fgets(Subject, 300, (FILE*)fp);
printf("%s\n", Subject);
}
}
}
int main()
{
listmails();
return 0;
}
答案 0 :(得分:2)
如果你的输入文件表示是准确的,那么你有大约11或12行,有些有可见文本,有些只有空格,可能是新行(\n
)
fgets() :
C库函数char * fgets(char * str,int n,FILE * stream) 从指定的流中读取一行并将其存储到字符串中 str指出。当读取(n-1)个字符时,它会停止 读取换行符,或者到达文件结尾,以哪个为准 先来。
...
成功时,该函数返回相同的str参数。如果 遇到文件结尾,没有读取任何字符, str的内容保持不变,返回空指针。
如上所述,您的代码似乎可以读取一些内容,而不是您认为正在阅读的内容:
fgets(From, 300, (FILE*)fp); //reads "To: Mark"
printf("%s\n", From);
fgets(ID, 300, (FILE*)fp); //reads "\n"
printf("%s\n", ID);
等等。
但是,从查看结果来看,我不确定您的代码段中包含的内容实际上是您编译的内容。
要改进,请尝试使用循环结构来读取文件:
enum {//list all known elements of your file
to,
from,
date,
subject,
max_lines
}
char header[max_lines][80];
char body[SOME_LARGER_NUMBER];// hardcoded size not best approach, just for illustration.
int i = 0;
while(fgets(header[i], 80, fp))
{
if(strlen[header[i]) > 1) i++; //increment lines index only when string has length > 1
}
获得标题信息后,启动新的循环部分以连接正文文本。