从文件c读取输入时出错

时间:2014-07-13 16:09:16

标签: c file

我一直在尝试从文件中读取输入,但似乎某些内容无法正常工作......而不是阅读单词" Words"在文本中,printf始终显示文件中未包含的2个附加随机字符...

功能是:

void search(struct word *w,FILE *f){

    char *c;
    char c2;
    int i,j,k,l;
    c=(char*)malloc(120*sizeof(char));                     

    i=1;             
    while(f!=NULL) { 
        c2=fgetc(f);

        while(c2!=EOF) {
           while(c2!='\n') {  
              k=0;
              while(c2!=' ') {
                  *(c+k)=c2;
                  k=k+1;
                  c2=getc(f);
              }
              if(w->name==c) 
                  insert(i,j+1,name,&w);
              }

              memset(c, 0, sizeof(c));
              j=j+k+1;
          }
          i=i+1;
       }
    }
}

主要功能是

int main()
{
    struct word *s;
    s=(struct word*)malloc(sizeof(struct word));
    s->name=(char*)malloc(20*sizeof(char));
    s->result=NULL;
    scanf("%s",s->name);
    search(s);
    printres(s);
    system("pause");
    exit(0);
}

并且结构是

struct position
{
    char *filename;
    int line;
    int place;
    struct position *next;
};
struct word
{
    char *name;
    struct word *right;
    struct word *left;
    struct position *result;
};

为什么会出现这些额外的2个字符?我该怎么办?

3 个答案:

答案 0 :(得分:1)

乍一看,这对我来说似乎不对

memset(c, 0, sizeof(c));

主要是因为它是char*,那么sizeof(c)将取决于编译细节...... 而且这个测试也是错误的:

if(w->name=c)  
你可能想要

if(strcmp(w->name,c) == 0)

终止缓冲区后,用' \ 0'。

此外,您应检查不要溢出缓冲区,否则结果将无法预测。

答案 1 :(得分:1)

缩进意味着您没有以正确的可读方式安排代码。

我假设您正在尝试逐行逐字地存储单词并从文本文件中逐字存储。但是我无法弄清楚你的insert()函数是做什么的。此外,这段代码有很多错误。

我先列出它们,然后你就可以说出你在这方面做了什么。

    缺少main():search(s)->file指针参数中的
  1. 原型是:void search(struct word * w,FILE * f)。

    您必须执行以下操作:

    • 首先使用fopen() function打开文件。
    • 使用从步骤i获得的指针。并将其作为参数插入search()函数中。

    这只是我给出的解决方案,你缺乏这方面的知识。您必须在using files in c.

  2. 上阅读更多内容
  3. 声明if(w->name=c)

    • 它" =="而不是" ="。在这里,您只将w->名称指定为c。
    • 您试图比较指针而不是其中的字符!比较指针将毫无用处。你为两者分配了不同的内存,地址如何相同?阅读comparing strings in c.
    • 的更多信息
    • 在比较之前,您必须使用' \ 0'(空字符)终止字符串。这通常会导致打印出不需要的字符。
  4. 网上有很多资源,可以准确回答你想做的事情。您可以使用Google搜索。我只能指出这么多错误,因为你的整个代码都有错误。了解更多我会说。

答案 2 :(得分:1)

我没有研究过代码的逻辑,所以我只想指出一些的问题:

c=(char*)malloc(120*sizeof(char));                     

这里的演员大多没用。当您尝试分配错误类型的数据时,可以用于警告您,但许多人建议使用以下方式来分配内存:

c = malloc (120 * sizeof *c);

无论c的实际类型如何,都会自动分配120个正确大小的项目。您还应该检查malloc()的返回值。分配可能会失败。

char c2;
c2=fgetc(f);

while(c2!=EOF) {

fgetc()函数返回signed int代表 unsigned char 范围内的字符,或 EOF 这是一个负值。

普通charsigned charunsigned char兼容。如果是unsigned,则它永远不会存储EOF的值,因此比较c2 != EOF始终为false。如果是signed,则它可以(通常,不一定)存储EOF,但它将具有与实际字符相同的值。

您应该将fgetc()的返回值存储在int变量中,将其与EOF进行比较,然后将其转换为char

if(w->name==c) 

这是否意味着字符串比较?它在C中不起作用。你只是在比较指针。要比较实际字符串,您必须拨打strcmp()或类似字符。

insert(i,j+1,name,&w);

(未定义的功能)

memset(c, 0, sizeof(c));

我假设您正在尝试将整个缓冲区设置为0,但大小错误。这会将sizeof (char *)个字节归零,而不是您分配的120个字节。

s=(struct word*)malloc(sizeof(struct word));
s->name=(char*)malloc(20*sizeof(char));

Pointless不会检查分配失败。这应该是(在我看来):

s = malloc (sizeof *s);
if (s) {
  s->name = malloc (20 * sizeof *s->name);
}
if (s && s->name) {
  /* Go to work */
} else {
  /* Allocation failure */
}

/* All done. Free memory. */
if (s) {
  free (s->name);
}
free (s);

因为free(0)是无操作,所以此清理适用于上述所有分支。

search(s);

search()函数需要第二个参数(FILE *)。

printres(s);

(未定义的功能)