在C中:如何检查输入文件是否存在,文件中的数字是int还是float,以及它们是否在一个范围内?

时间:2012-05-13 14:34:17

标签: c

首先,这是我的第一个C项目(也是我在任何语言中的第一个编程项目之一),所以如果我的语法看起来很奇怪,或者我做了一些奇怪的事情,我道歉。

我有一个使用三个输入文件的程序。每个文件包含几个数字:一些是整数,一些是浮点数。我设法检查文件是否存在,但不是其他东西。如果不满足任何这些要求,程序应该结束并相应地显示错误消息。我已经看到了问这些事情的问题,但并非所有问题都结合在一起。我看到的答案也需要退出一点空间。我希望尽可能少地完成这项工作。非常感谢帮助。

我一直在研究的一个脚本可以在下面看到。如果输入文件不存在,它会给出错误消息,但是我已经删除了检查int与float以及它们是否在范围内的尝试。


#include "header.h"
void visualreader(int *x_range, int *y_range, int *z_range,
                  int *x_cells, int *y_cells, int *z_cells, int *time) {

  // Scans the input file containing parameters for visualizing
  // the velocity vector field
  FILE *fp = fopen("visual_input.dat", "r");

  if (fp) {
    fscanf(fp, "%d %d %d\n", x_range, y_range, z_range);
    fscanf(fp, "%d %d %d\n", x_cells, y_cells, z_cells);
    fscanf(fp, "%d\n", time);
    fclose (fp);
  } else {
    perror("error opening the file" );
  }
}

5 个答案:

答案 0 :(得分:1)

  

检查输入文件是否存在

fopen()如果失败则会返回NULL,因此使用fp的条件是正确的方法。

  

如果文件中的数字是int或float

您必须以字符串形式读取值,然后手动检查字符串中的.。老实说,如果值可以浮动,那么就假设它们总是浮动并且如此读取它们。在这个阶段,没有什么好处会使你的程序复杂化以优化整数。

  

如果它们在一个范围内

对于已读入的每个值(作为浮点数),只需手动检查,如:

if (x_range < minimum_value || x_range > maximum_value) {
  error_routine(...);
}

答案 1 :(得分:1)

要检查普通C中是否存在文件,您可以在unistd.h中使用access函数,如下所示:

if( access( "visual_input.dat", F_OK ) != -1 ) {
    // file exists
} 

答案 2 :(得分:0)

测试文件的存在是特定于操作系统的。但是,仅使用标准库调用,fopen()失败时 errno 已设置; vallue是特定于操作系统的,但您可以使用perror()来输出有意义的消息。

由于您使用的是fscanf(),这意味着值是数值的ASCII表示而不是二进制值。如果将所有值解释为浮点,则使用%f格式说明符,这将正确解释实数整数十进制表示。这比通过检查确定一个数字是否是一个整数更容易。

答案 3 :(得分:0)

以下是检测文件是否存在的示例。

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

int main(){
    FILE *fp;
    errno = 0;
    fp=fopen("Not_exist.txt","r");
    if(fp == NULL && errno == ENOENT)
        perror("file does not exist");
    else
        fclose(fp);

    return 0;
}

答案 4 :(得分:0)

以下示例是主程序,但很容易成为库函数。它不打印任何内容,而是返回一个值,以防它变成库函数。

要测试这个程序 - 我正在使用Ubuntu 10.04 - 我只需echo $?程序完成后,请查看错误代码。 0表示成功,非零表示失败。

如果文件打开成功,我添加了一个fclose。打开文件而不关闭文件是不好的做法。

我已经检查了errno和fp的值。我确实检查了C fopen文档,你真正需要检查的是fp的值是否为NULL。因此,我使用||而不是&amp;&amp;。

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

#define MIN_ARGS_SUPPLIED 2

int main(int argc, char *argv[])
{
    FILE *fp;
    int rc = 0;

    if(MIN_ARGS_SUPPLIED != argc)
    {
       printf("Usage: file_detect file-name\n");
       rc = -1;
    }
    else
    {
        errno = 0; /* errno is already declared by including errno.h */

        fp=fopen(argv[1],"r");

        if(fp == NULL || errno == ENOENT)
        {
           rc = errno; 
        }
        else
        {
            fclose(fp);
        }
    }

    return rc;
}