从C中的文件扫描

时间:2016-05-17 22:03:28

标签: c file eof

我正在尝试使用以下代码扫描文件中的字符串。但我的程序打印出奇怪的字符。任何想法如何阻止这种以及如何在打印字符串时保持单词之间的空格?

这里是文件的内容(test.txt)  (test.txt)

这是我的程序的输出:

output

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

typedef struct
{
   char word[80];
   int length;
   int freq;
} sent;

int main()
{
   sent a[50];
   int v,status;
   int i=0,cnt=0;
   char*y;

   FILE*p;
   p=fopen("C:\\Users\\User\\Desktop\\test.txt","r");
   status=fscanf(p,"%s",a[i].word);
   while(status !=EOF){
      i++;
      status=fscanf(p,"%s",a[i].word);
   }
   for(i=0;i<50;i++)
   {
      char *y=strtok(a[i].word,"!@#$%&*?.");

      while(y!=NULL)
      {
         printf("%s",y);
         y=strtok(NULL,"!@#$%&*?.");

      }
   }
}

2 个答案:

答案 0 :(得分:2)

正如人们所评论的那样,你所阅读的文件中可能没有50个单词,但你的循环仍试图循环超过50个......所以这一行

for(i=0;i<50;i++)

应修改为

int w;
for(w=0;w<i;w++)

你应该在循环中替换iw的使用(或者你打算在while循环中使用变量cnt,因为你的当前未使用码)。

如果你的文件有超过50个单词等,你需要保护缓冲区溢出,但这超出了这个答案的范围。

更新以回答您的评论:

要在单词之间留出空格,只需将它们添加到输出中,例如

printf("%s ",y);

然而,您的scanf将在任何空格处终止字符串扫描,因此空格(十六进制20),换行符(\ n),制表符(\ t)或返回(\ r)将全部为字符串的终止字符 - 如果你想要保存和输出它,你只需要扫描那些,比如

  char theString[50];
  char theSpace;
  int matched = scanf("%s%c",theString, theSpace);

如果匹配== 2那么你已经扫描了一个字符串和终止扫描的空间,你可以像

一样打印它
  printf("%s%c",theModifiedString,theSpace);

答案 1 :(得分:0)

这只是字符串操作。我稍微调试和修改了你的程序,以便有文本输出而不是垃圾。您可能需要对其进行更多修改,但它现在会打印文件的内容。你得到垃圾字符的原因是循环不知道什么时候停止字符串没有终止,所以你从别的东西得到内存内容。推荐的方法是fgets来读取文件并保留空格。

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

typedef struct {
    char *word;
    int length;
    int freq;
} sent;

int words(const char *sentence) {
    int count, i, len;
    char lastC;
    len = strlen(sentence);
    if (len > 0) {
        lastC = sentence[0];
    }
    for (i = 0; i <= len; i++) {
        if (sentence[i] == ' ' && lastC != ' ') {
            count++;
        }
        lastC = sentence[i];
    }
    if (count > 0 && sentence[i] != ' ') {
        count++;
    }
    return count;
}

int main() {
    sent a[50];
    int v, status;
    int i = 0, cnt = 0;
    FILE *p;
    p = fopen("data.txt", "r");
    char buf[100], title[100];
    fgets(buf, sizeof buf, p);
    int j = words(buf);
    char *yy;
    yy = strtok(buf, "!@#$&*?%.");

    while (yy != NULL) {
        a[i].word = yy;
        yy = strtok(NULL, "!@#$&*?%.");
        i++;
    }

    for (int k = 0; k<i; k++) {
        printf("%s", a[k].word);
    }
}

程序将缓冲区标记化并保留空白。我将您阅读文件的方式更改为fgets

<强> data.txt中

  

从1到10的等级,你最喜欢的字母是什么颜色

<强>输出

从1到10的等级,您最喜欢的字母颜色是什么