g++ errno_t 和 fopen_s Debian 8.1 Jessie 中的错误

g++ errno_t and fopen_s error in Debian 8.1 Jessie

我在 Windows 8.1,Visual Studio 2013 Express 中编写了一些代码。现在,我正在尝试传输 运行 我的 Beagle Bone Black 上的代码,它是 运行ning Debian 8.1 Jessie。这是我第一次使用 Linux,所以我遇到了一些问题。

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

using namespace std;

int main()
{
    FILE *cfPtr;
    errno_t err;

    if ((err = fopen_s(&cfPtr, "objects.txt", "a +")) != 0) // Check if we can reach the file
        cout << "The file 'objects.txt' was not opened.\n";
    else
        fclose(cfPtr);

    return 0;
}

我用以下代码编译这段代码:

g++ source.cpp -o source

但它给了我一些...未在此范围内声明的错误。

source.cpp: In function ‘int main()’:
source.cpp:10:4: error: ‘errno_t’ was not declared in this scope
source.cpp:10:12: error: expected ‘;’ before ‘err’
source.cpp:12:8: error: ‘err’ was not declared in this scope
source.cpp:12:50: error: ‘fopen_s’ was not declared in this scope

我明白了,Windows 的 *_s 函数,那么我该如何解决这个问题和 errno_t 问题?

谢谢。

如您所说,fopen_s 是 Microsoft Windows 对 C 标准库的特定扩展,您需要改用 fopen。

现在,errno_t 基本上只是一个 int,所以您 可以 使用 int 代替。

我建议这样做:

#include <iostream>
#include <stdio.h>

using namespace std; // bad

int main(){
     FILE *cfPtr = fopen("objects.txt", "r");

     if (cfPtr == NULL){
         cout << "The file 'objects.txt' was not opened.\n";
     } else {
         cout << "Success!";
         fclose(cfPtr);
     }
     return 0;
}

请注意,如果文件不存在,"a+" 将创建一个新文件,因此无论如何它在大多数情况下都可以使用。我决定改用 "r",因为如果文件不存在,这将失败——例如。