Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C中检查文件是否存在并创建新文件_C_File_Raspberry Pi - Fatal编程技术网

如何在C中检查文件是否存在并创建新文件

如何在C中检查文件是否存在并创建新文件,c,file,raspberry-pi,C,File,Raspberry Pi,我是C语言编程新手,我正在使用C编译器为Raspberry Pi编程。我只想创建一个函数,将字符串作为参数,并将其保存为特定位置的文本文件。我想检查该文件位置以查看存在哪些文件,并将新文件保存到该文件夹中,文件名的增量为1 例如,文件夹包含: 测试文件1 测试文件2 我希望能够创建另存为TestFile3的新文件 这是我到目前为止所掌握的代码,我想知道我的思路是否正确,并获得任何提示,请: void WriteToFile(unsigned char *pID) { printf("Writin

我是C语言编程新手,我正在使用C编译器为Raspberry Pi编程。我只想创建一个函数,将字符串作为参数,并将其保存为特定位置的文本文件。我想检查该文件位置以查看存在哪些文件,并将新文件保存到该文件夹中,文件名的增量为1

例如,文件夹包含:

测试文件1 测试文件2

我希望能够创建另存为TestFile3的新文件

这是我到目前为止所掌握的代码,我想知道我的思路是否正确,并获得任何提示,请:

void WriteToFile(unsigned char *pID)
{
printf("Writing to file. . . . .\n");

/* Checking to see how many files are in the directory. */
int *count = 0;
DIR *d;
struct dirent *dir;
d = opendir("table_orders");
if(d)
{
    while((dir = readdir(d)) != NULL)
    {
        printf("%s\n", dir->d_name);
        count = count + 1; // Adds 1 to count whenever a file is found.
    }
    closedir(d);
}

char str[sizeOf(count)]; // Creates string.
sprintf(str, "%d", count); // Formats count integer into a string.

File *f = fopen("table_orders/Order " + str + ".txt", "a"); // Creates new file.

if(f == NULL)
{
    printf("Error opening file!\n");
    exit(1);
}

fprintf(f, "Order: %s \n", pID);

fclose(f);

printf("The Order %s has been written to the file\n", pID);
}
您可以使用(在Windows中)查看文件是否存在。如果在
errno
设置为
enoint
时失败,则该文件不存在。这是另一种可能性

当然,它不是原子的,其他一些进程可以在支票和调用
fopen
之间创建文件

int fd = open( "filename", O_RDWR | O_CREAT | O_EXCL, 0644 );

没有其他东西是原子的-另一个进程可以在检查文件是否存在和您实际创建文件之间创建文件。

您很接近,但离目标太远了,我认为您需要暂停此操作。阅读一些带有结构化示例的c教程。 当您读取目录并任意增加计数时,会出现算法错误。逻辑应该更像 解析目录->命名为3个标记“Testfile”0001.log” 使用atoi或类似工具将数字字符串转换为int

当您声明str时,您对sizeof缺乏理解,它应该更像 char-str[25]; 这足以将4字节int的所有数字作为字符串保存。sizeof计数可能为4字节32位

当您打开时,您可以执行类似“Dir/file”+str+.log”的操作 这不是你怎么做的,+在c中是数学的。您需要在一个新的工作字符串中使用strcat或sprintf,动态创建和释放

在像这里这样的文件中添加数字时,在短数字前面加0是有意义的。这将生成具有良好ls顺序的常规文件名

如果需要控制“创建”和“独占”,则需要使用“打开”打开文件,并将其打开到文件类型文件句柄

当您开始使用此功能时,您需要防止另一个进程使用调度信号量或“.lock”文件导致计时错误

您还需要一些维护例程来删除旧日志,然后对001中的所有剩余日志重新编号


PS不知道为什么会有反对票

一个简单的谷歌会回答你的问题。我知道,但我试过了,没有找到我想要的,我不确定最好的搜索方式是什么。你有什么建议?
File*f=fopen(“table_orders/Order”+str+”.txt、“a”)
不能像在C中那样连接字符串。
charstr[sizeOf(count)]
和count是指向int的指针,而不是int。我可以使用DIR来搜索目录。使用该函数是否可以获取目录中的文件数量?当将数字放入字符串(如您所用)时,在数字前面加0表示所有4个字符的空格更为合理。另外,请阅读fopen的手册页,它会创建带有常用标志的空新文件。
open(O|u CREATE | O|u EXCL)
@EOF O|u CREATE等在缓冲文件中的fopen不受很好的支持protocol@rhubarbdog:
int fd=open(文件名,访问| O|u创建| O|u排除,模式);文件*fp=fdopen(fd,模式)那里,有那么难吗?@EOF不要把你的回答对准我,因为我知道怎么做。很抱歉,我以前没有遇到过O_RDWR、O_CREAT和O_EXCL。它们是什么意思?我只是尝试搜索它们,但除了它们是文件的Linux访问模式之外,找不到任何清晰的定义。@jamesheade:它通过调用shell命令
man 2 open
来表示RTF手册页。我现在明白了这些意思,我刚刚找到了它们的好定义。我会试试的,谢谢。