我在c的计算机科学课程中遇到了麻烦。我正在调用一个我创建的函数,它从一个文件读取,将它存储在一个char数组中,然后将其发送到我创建的另一个函数,以便我可以从包含一个名为string的特定字符串的单行打印结果。一切似乎都有效。如果我想打印整个文档,我发送NULL代替字符串。但是,完成此操作后,程序还会打印出上次调用函数的结果,而不是使用NULL代替字符串。我无法弄清楚为什么。任何帮助是极大的赞赏。这是适当的代码。
/*getText.c*/
#include<stdio.h>
#include<errno.h>
#include<stdlib.h>
#include<string.h>
#include"getText1.h"
void getFileText(char *fileName, char *keyWord)
{
FILE *file = fopen(fileName, "r");
char *answer = (char*)malloc(sizeof(char)*MAX_FILE);
if(file != NULL)
{
fread(answer, sizeof(char), MAX_FILE, file);
parseText(keyWord, answer);
}
else
{
perror("Error in getText.c, fopen:");
exit(-1);
}
fclose(file);
free(answer);
}
void parseText(char *string, char *text)
{
char buff[MAX_FILE];
char * ptr;
int a = 0;
strcpy(buff, text);
ptr = strtok(buff, "\n");
if(string != NULL)
{
while(ptr != NULL && a == 0)
{
if(strstr(ptr, string) != NULL)
{
printf("test1 ");
printf("%s\n", ptr);
printf(" test2\n");
a = 1;
}
ptr = strtok(NULL, "\n");
}
}
else
{
printf(text);
}
}
/*main*/
#include<stdio.h>
#include<string.h>
#include"getText1.h"
#include"fileName.h"
int main ()
{
getFileText("/proc/diskstats", "sda");
printf("Uptime ");
getFileText(UPTIME, NULL);
getFileText(TIME, TIME_KEYWORD);
printf("Kernel Version ");
getFileText(KERNEL, NULL);
return 0;
}
我得到的问题是第一次调用getFileText()工作正常,并打印出相应的行。但是,当我再次为UPTIME调用字符串为NULL时,它打印出整个/ proc / uptime(或UPTIME),然后打印整个/ proc / diskstats并在我为KERNEL调用它时执行相同的操作,但是当我把它称为TIME时,它会起作用。
答案 0 :(得分:0)
在getFileText()
中,您从文件中读取了malloc
'的缓冲区,但您无法知道文件末尾的位置。然后在parseText
strcpy(buff, text);
进行strcpy
。可能发生的是,这是复制所有文件,然后只是在读取文件结束后复制脏内存,该文件仍包含先前文件读取的内容。
fread
函数读取,直到找到空字节,但在读取文件的末尾没有任何空字节。要解决此问题,您必须检查{{1}}的返回值以找出实际读取的字节数,然后在程序中包含一个方法,以便其他函数知道数据的结尾在哪里应该与之合作。