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