【问题标题】:Using a file for input in C在 C 中使用文件进行输入
【发布时间】:2013-10-06 00:09:04
【问题描述】:

我尝试编写一个程序,该程序将文本文件作为输入,然后使用用户输入进行二进制搜索。问题是,当我编译并运行它时,程序会自动退出并退出,并且不允许用户输入。

我怀疑它仍在以某种方式读取数据文件,但它应该已经没有选项了。有什么想法吗?

代码:

#include <stdio.h>
#include <stdarg.h>

int A[100];
char search;
int i, key, len, imin, imax, KEY_NOT_FOUND;
int result;

main() {
// Scan in array length.
scanf("%d", &len);
// Scan in array integers.
for(i = 0; i < len; i++) {
    scanf("%d", &A[i]);
}

imin = 0;
imax = len - 1;

printf("Welcome to Binary Search!");
printf("\nDo you want to search for an integer? (y/n) ");
scanf("%c", &search);

while(search == 'y') {
    printf("\nDo you want to search for an integer? (y/n) ");
    scanf("%c", &search);

    result = binary_search(*A, key, imin, imax);
    printf("\n%d", result); 
}
}

int binary_search(int *A, int key, int imin, int imax) {

// Test if array is empty
if(imax < imin)
    // Set is empty, so return value showing not found.
    return KEY_NOT_FOUND;
    else {
    // Calculate midpoint to cut set in half
    int imid = midpoint(imin, imax);

    // Three-way comparison
    if(A[imid] > key)
        // Key is in lower subset.
        return binary_search(A, key, imin, imid - 1);
    else if(A[imid] < key)
        // Key is in upper subset.
        return binary_search(A, key, imid + 1, imax);
    else
        // Key has been found.
        return imid;
    }
}

int midpoint(int imin, int imax) {

int imid = imax / 2;
return imid;
}

这是文本文件:

10
-144 -1 0 10 75 233 341 1000 8192 57885161

示例命令条目:

a.out < data.txt

样本输出:

Welcome to Binary Search!
Do you want to search for an integer? (y/n) y
Enter the Integer: 341
341 Found!
Do you want to search for an integer? (y/n) n
The End!

已编辑,因为答案未考虑问题。代码不打印 n found yet.

【问题讨论】:

  • 你在哪里打开了文本文件?key的值是多少?你为什么用printf("\nDo you want to search for an integer? (y/n) "); scanf("%c", &amp;search);
  • 投票结束。 OP 正在询问文件处理,但在提供的代码中没有类似的内容。
  • 我们可能会假设他所指的“文件”是标准输入,也许程序(旨在)从终端或通过命令行重定向提供的文件工作。
  • 使用示例命令条目编辑。
  • 请注意,a)您的代码要求输入 y/n,如果答案是“y”,则立即再次要求输入 y/n,并且 b)从不问“输入整数:”这个问题您的示例输出暗示并且 c) 从标准输入读取问题的答案,在您的示例输出中,标准输入被重定向到 data.txt,但您的示例输出暗示问题是从终端读取的,而不是 (stdin) 文件。 stdin 可以是键盘或重定向文件,但显然不能同时是两者...

标签: c file input scanf


【解决方案1】:

您的第一个问题可能是这样的:

 scanf("%c", &search);

%c 不会跳过空格(与 %d 不同),所以如果有 换行符或输入中尚未被吃掉的东西 点,那么search 将不等于'y',程序将退出。 当然还有其他问题,但这似乎是一个 导致混乱的立即退出。如果您使用编译器标志 要求尽可能多的警告,编译器可能会帮助你 找出一些其他的问题...

就在您想读取“y”之前,您可以使用循环来吃掉所有非空白字符。例如:

while(scanf("%*[ \t\r\n]") > 0)
    ;

然后,您的程序将成功读取 'y',并继续执行下一个将崩溃的地方。 :-)

当然,这假设您没有重定向标准输入。如果您已将标准输入重定向到文件,则该文件必须包含对 y/n 问题的答案。如果您确实希望将数据存储在文件中,但以交互方式询问/回答问题,那么您将需要用户在命令行上向您传递文件名,使用 fopen 打开它,并使用生成的句柄当您想从文件而不是键盘读取时。

【讨论】:

  • 查看添加的如何吃空白的示例。如果您想彻底了解为什么“没有运气”,您可以在循环中使用 getchar() 来读取并准确打印出哪些字符会导致您出现问题(例如,'\r')。但是,如果您在尝试使用 %c 进行扫描之前使用 some 技术来吃掉空白空间,那么生活通常会更轻松。
  • @Ron Burk 为什么不简单地scanf(" %c", &amp;search);
  • @chux 是的,这可能是一个更好/更简短的答案。但是由于我不知道“空白”是如何定义的(它是否与 *nix 下的 '\r' 匹配?在所有版本的 C 标准下?)更长的方式应该是口香糖工作,哪个当有人对许多不起作用的事情感到困惑时,有时比简洁更重要。
  • @Ron Burk C11dr 7.4.1.10 定义了空白,它是特定于语言环境的,scanf(" %c" 使用它。这个答案使用了程序特定的空白定义。我也不知道char 是空格,但我不需要知道。通过在scanf()isspace() 中使用" ",我使用了与编译器和运行时空白空间视图相匹配的相同空白空间定义。
【解决方案2】:

首先,您的程序不会等待用户输入。在main()末尾添加getchar();或稍微修改scanf:

printf("\nDo you want to search for an integer? (y/n) ");
scanf(" %c", &search);
     //^ added space 

接下来,您的程序没有读取文件 - 按照上面/下面的说明实现它。

【讨论】:

  • 我知道 scanf 可以与管道一起使用。所以我应该能够运行 a.exe
【解决方案3】:

要从 C 中读取文件,您应该使用类似的东西:

FILE *inputfile;
char *mode = "r"; //we use r because you just want to read file
inputfile = fopen("YOURFILENAME", mode);

之后,您可以使用“fscanf”函数从文件中读取值:

fscanf(inputfile, "%d", &len); 

完成文件读取后,只需写入:

fclose(inputfile); 

【讨论】:

  • 我用我的 scanf 和用于扫描的 for 循环替换了这段代码(并添加了对数组的扫描)。程序编译并运行,但不显示任何内容。
  • 尝试打印您从文件中读取的内容。如果它们是真的,你应该检查你的二分搜索功能。从文件读取的详细信息在这个网站上写得很好,你可以检查here
猜你喜欢
  • 2021-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多