0

我是一个编程技能非常糟糕的菜鸟。

我有一个文本文件,内容如下:

(括号中的大字符串) integer_value

(括号中的大字符串) integer_value

(括号中的大字符串) integer_value

(括号中的大字符串) integer_value

我有一个程序可以读取标准输入上的字符串并返回一个值。

我需要某种方法将字符串(并且只有字符串)传递给程序,并将它返回的值与文本文件中的值进行比较。

我试图用 Bash 脚本来做这件事,但我真的很困惑和沮丧,所以我想我会尝试用 C 来做。

int main(void)
{
int x;          
FILE *fp;
fp = fopen("vectors.lst", "r");

if (fp == NULL) {
     printf("Failed to open\n");
     exit(0);
  }

    for(i = 1; i<10400; i++){


        //This is where I am confused

            while(fscanf(fp, "%s %d",passedstring,correctvalue) != EOF){

        printf("%s",passedstring);


            }
}
exit(0);
}

我的问题是:

我不知道如何只遍历 for 循环中的字符串,而仍然只读取到文件末尾。我开始认为为此使用 C 是一个糟糕的主意。

任何人都可以提供一些建议吗?如果有一种简单的方法来实现它,我仍然愿意使用脚本。

4

3 回答 3

0

嗯,有一段时间没有在<stdio.h>图书馆这样做了。前段时间,我为此写了一篇文档。它实际上仍然在这里漂浮在网上。我重读了一遍,还是不错的。(看起来有人甚至在几年前发表了一条我没有回应的评论......哎呀)。不过,您可能也想阅读它。

使用 C stdio 库,您几乎可以做任何事情,但由于缓冲区溢出和处理不当的错误处理,它可能会面临危险。但它可以做到(但我个人的偏好是如果可以的话使用perl)。

您对此并没有真正指定太多,但我会试一试。我认为是这样的:

#include <stdio.h>
#define STRINGIZE_(x) #x
#define STRINGIZE(x) STRINGIZE_(x)

int main()
{
  FILE *fp;
  fp = fopen("vectors.lst", "r");

  if (fp == NULL) {
    printf("Failed to open\n");
    /* Exit return of non-zero to indicate an error to calling process */
    return 1;
  }

#define MAX_BUFFER 1024
  char passedstring[MAX_BUFFER+1];
  passedstring[MAX_BUFFER] = 0;
  int correctvalue = 0;
  int position;

  position = 0;
  /* " " - ignore any leading whitespace if any
   * "(" - match open parenthesis
   * "%" STRINGIZE(MAX_BUFFER) "[^)]" - store up to MAX_BUFFER chars 
   *       that are not ')'
   * ")" - match close parenthesis
   * " " - match any whitespace if any
   * "%d" - store int value
   * "%n" - store current read byte from fscanf(), if parse fails, store
   *        doesn't occur.  Ensures that everything has been read in.
   **/
  while(fscanf(fp, " (%" STRINGIZE(MAX_BUFFER) "[^)]) %d%n"
        , passedstring, &correctvalue, &position) != EOF
      && position > 0)
  {
    printf("%s, %d\n", passedstring, correctvalue);
    position = 0;
  }
  printf("End %d", position);

  /* Exit code returned here.  Not advised to use exit() for something like this. */
  return 0;
}
#undef MAX_BUFFER

不确定您的外部 for 循环是做什么用的。这只是读取直到它到达文件的末尾,或者如果一个字符串太大以至于它比缓冲区大。如果你想做一些恢复代码,我会留给你。

我通过编译器运行它。现在已验证可以正常工作。

于 2013-05-25T04:03:19.873 回答
0

既然您知道字符串将以 ')' 结尾,为什么不可以使用 getchar() 来读取字符串。使用类似的东西:

  do {
    c=getchar();
    //process input
  } while (c != ')');
于 2013-05-23T19:04:23.260 回答
0

有些东西我不太清楚,但我觉得很像。

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

int main(void){
    int x;
    char buff[4096];
    FILE *fp;


    fp = fopen("vectors.lst", "r");

    if (fp == NULL) {
        printf("Failed to open\n");
        return 1;
    }

    printf("search value: ");
    scanf("%d", &x);

    while(fgets(buff, sizeof(buff), fp)){
        char *p;
        p=strrchr(buff, ' ');//(....) integer\n
        if(atoi(p+1) == x){//found! (correctvalue : from p+1)
            *p ='\0';
            printf("%s\n", buff);//copy
            break;
        }
    }
    fclose(fp);

    return 0;
}
于 2013-05-23T22:07:12.107 回答