文件输入/输出和搜索

时间:2013-11-10 07:43:16

标签: c io

我需要打开一个文件,然后计算某个序列出现在文件中的时间,空格被忽略。通过命令行使用输入文件名和序列。这是我的方法:我打开文件,然后将内容存储到一个数组,然后从该数组中删除所有空间并将其存储到另一个数组。然后,我搜索序列并计算它出现的次数。这是我的代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void main (int argc, char *argv[])
{
char *tempRaw;
char *temp;
int size;
//Input check
if(argc != 3) 
{
fprintf(stderr, "Usage: %s Input Search\n", argv[0]);
exit(1);
}
//Open files
FILE *input = fopen(argv[1],"r");
//Check for file
if(input == NULL) 
{
    fprintf(stderr, "Unable to open file: %s\n", argv[1]);
    exit(1);
}
//Get the file size
fseek (input,0,SEEK_END);
size = ftell(input);
rewind(input);
//Allocate memory for the strings
tempRaw = (char*) malloc(sizeof(char)*size);
temp = (char*) malloc(sizeof(char)*size);

//Copy the file's content to the string
int result =0;
int i;
fread(tempRaw,sizeof(char),size,input);
//Remove the blanks
removeBlanks(temp,tempRaw);
fclose(input);

char *pointer;
//Search for the sequence
pointer = strchr(pointer,argv[2]);
// If the sequence is not found
if (pointer == NULL)
{
    printf("%s appears 0 time",argv[2]);
    return;
}
else if (pointer != NULL)
{
    //Increment result if found
    result ++;
}
while (pointer != NULL)
{
    //Search the next character
    pointer = strchr(pointer+1,argv[2]);
    //Increment result if the sequence is found
    if (pointer != NULL)
    {
        result ++;
    }
    //If the result is not found, pointer turn to NULL the the loop is break 
}

printf(" Sequence : %s\n",temp);
printf("%s appears %d time(s)\n",argv[2],result);
}

void removeBlanks( char *dest, const char *src)
{
//Copy source to destination
strcpy(dest,src);
char *old = dest;
char *new = old;
//Remove all the space from destination
while (*old != '\0') 
{
    // If it's not a space, transfer and increment new.

    if (*old != ' ')
    {
        *new++ = *old;
    }
    // Increment old no matter what.

    old++;
}

// Terminate the new string.

*new = '\0';

}

我测试了它,我在从文件中获取内容时遇到问题。有时它可以工作,但大多数时候,我得到的只是一个空字符串。

1 个答案:

答案 0 :(得分:1)

您的代码存在一些问题,编译器应该给您警告(并且不要忽略编译器):

应该声明第一个函数,而不仅仅是定义,所以添加:

void removeBlanks( char *dest, const char *src);
在主要之前。根据C99标准( 5.1.2.2.1程序启动),main应使用int main(int argc, char *argv[])之类的返回值声明,并且应添加适当的return语句。

如上所述casting malloc is not needed

上面的问题并不是为什么它不起作用...因为你在错误的变量上以错误的方式使用strchr函数:

pointer = strchr(pointer,argv[2]);

应该是

pointer = strchr(temp, *argv[2]);

因为temp是指向您从文件中读取的内容的指针,而strchr需要char作为第二个参数,而不是char *。如果您要搜索字符串,则必须使用strstr并且需要char *,如下所示:

pointer = strstr(temp, argv[2]);

此外,由于您从tempRaw中删除空格并将新字符串存储在temp中,因此第二个字符串将更短并且最后会变为垃圾,因此您应该初始化内存,如:

tempRaw = calloc(1, size);

也可能有其他错误,但这些更改使它对我有用......