c++ - 是否可以在 c/c++ 中将 8 个字符(每个 1 字节)存储在 double 类型(8 字节)的变量中?

标签 c++ c char multilingual

我正在将一些遗留的 Fortran77 代码迁移到 C/C++。在Fortran77代码中,如果从文件中读入8个字符,可以毫无问题地存储到real*8类型的变量中。

是否可以在 C 或 C++ 中做类似的事情?如果是这样,我该怎么做?我无法在互联网上找到任何解决方案。我需要使用 C/C++ 读入 8 个字符并将它们存储在一个 double 类型的变量中,然后将其传递回 Fortran 并对应于原始的 real*8 变量。

非常感谢您的帮助。

编辑: 作为对@sixlettervariables 的回应,我将进一步澄清我的用例。我对他的建议的问题是我在运行时只知道每一行的格式(即哪些字段是字符串,哪些数字),因此我不知道该结构应该静态包含哪些成员。这些字段还需要按照它们被读入的顺序占据一个连续的内存块。

具体来说,在程序的一次运行中,每一行的格式可能是:f1:string, f2:number, f3:number, f4:string,但在另一个f1中:字符串,f2:字符串,f3:字符串,f4:数字,f5:数字。对于第一种情况,我需要:

struct { char[8] f1; double f2; double f3; char[8] f4}

第二个我需要:

struct { char[8] f1; char[8] f2; char[8] f3; double f4; double f5} 

也许有一些方法可以用模板做到这一点?

最佳答案

您不需要将它们存储在 double 中只是因为 Fortran 需要这样做。事实上,您绝对不应该在您的 C/C++ 代码中这样做。

简单地将字符数据存储在字符数组中。

如果您混合使用 Fortran 和 C/C++,则两者在 ABI 之外对彼此一无所知。从 C 端,您可以简单地声称 Fortran 接口(interface)接受一个字符数组,而实际上它需要一个 double 组。 Fortran 方面也是如此。

从C端:

extern void FCHARS(char* str, int length);

/* ... */
int flength = 0; /* optional: length of the string in Fortran terms */
char str[9]; /* in C/C++ add one for \0 at the end */

/* read in up to a block of 8 */
fgets(str, sizeof(str), fp);

/* At this point if you know the 8 characters are space padded to their end
 * you have no more work to do, otherwise you may need to fill from the right
 * with spaces.
 */
{
    size_t ii = sizeof(str) - 1;
    while (ii > 0 && str[ii - 1] == '\0') {
        str[ii - 1] = ' ';
        flength = ii--;    /* optional: keep track of our unpadded length */
    }
}

/* Once you've space padded the string you can call your Fortran method.
 * If your Fortran method accepts a string of unknown length, supply
 * `flength`. If your Fortran method expects a string of a fixed length, pass
 * the size of `str` (excluding '\0') instead.
 */
FCHARS(str, flength);

只要您在 C/C++ 代码中遵循 Fortran 编译器的 ABI 要求(例如 CDECL,隐藏字符串长度交错传递),就没问题。

关于c++ - 是否可以在 c/c++ 中将 8 个字符(每个 1 字节)存储在 double 类型(8 字节)的变量中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16463080/

相关文章:

c++ - C++中的std::vector与[]比较慢-为什么?

c - 静态库结构和包含

c - 为什么我不能为 glib 构建 "hello world"?

c - 简单的程序无法用 C 语言编译

java - next() 和 next().CharAt(0); 之间的区别

c++ - 合并位,然后判断结果有多少个0

c++ - 在 C++ 中运行外部应用程序的回调

c++ - 在 VS2010 中创建指向字符串的 LPCTSTR 指针

java - 确定一对字符串中的任何一个是否结束另一个字符串

c++ - 返回一个 const char *