0

首先,这是我的第一个 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" );
  }
}
4

5 回答 5

1

检查输入文件是否存在

fopen()NULL如果失败,将返回,因此您的条件 withfp是正确的方法。

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

您必须将值作为字符串读取,然后手动检查.字符串中的 a。老实说,如果这些值可以是浮点数,那么只需假设它们始终是浮点数并照此读取它们。在这个阶段使您的程序复杂化以优化整数是没有好处的。

如果它们在一个范围内

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

if (x_range < minimum_value || x_range > maximum_value) {
  error_routine(...);
}
于 2012-05-13T14:43:15.893 回答
1

要检查文件是否存在于纯 C 中,您可以使用unistd.h 中的访问函数,如下所示:

if( access( "visual_input.dat", F_OK ) != -1 ) {
    // file exists
} 
于 2012-05-13T15:16:02.463 回答
0

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

为了测试这个程序——我使用的是 Ubuntu 10.04——我只是echo $?在程序完成时,所以查看错误代码。0 是成功,非零是失败。

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

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

#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;
}
于 2012-07-15T21:51:34.863 回答
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;
}
于 2012-05-13T22:17:25.707 回答
0

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

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

于 2012-05-13T18:05:50.333 回答