java - 如何从 Java 编写的文件中读取 C 语言的数据(二进制或文本)?

标签 java c file text-files binaryfiles

用Java编写:

File file = new File("abc");
try(FileOutputStream fos = new FileOutputStream(file)) {
    FileChannel outChannel = fos.getChannel();
    ByteBuffer buffer = ByteBuffer.allocate(Integer.BYTES*3).order(ByteOrder.nativeOrder());
    buffer.putInt(154);
    buffer.putint(98);
    buffer.putInt(6);
    outChannel.write(buffer);


    IntStream.rangeClosed(1,3).forEach((iter) -> {
        String reqString = (Integer.toString(iter) + "_string");
        byte[] bytes = reqString.getBytes(Charset.forName("US-ASCII"));
        ByteBuffer byteBuffer = ByteBuffer.allocate(bytes.length).order(ByteOrder.nativeOrder());
        byteBuffer.put(bytes);
        try {
            outChannel.write(byteBuffer);
        }
        catch(IOException ex) {
            ex.printStackTrace();
        }
    });
}   
catch(IOException ex) {
    ex.printStackTrace();
}

用 C 语言阅读: int main() { 整数一、二、三; 文件 *fp = fopen("abc","r+");

fscanf(fp,"%d",&one);
fscanf(fp,"%d",&two);
fscanf(fp,"%d",&three);

printf("%d %d %d",one,two,three);

char ch;
fread(&ch,sizeof(char),1,fp);
while(ch!= '\0') {
    printf("%c",ch);
    fread(&ch,sizeof(char),1,fp);
} 
return 0;
}

输出为: [output1]

我不明白我所看到的。共有三个值,但都不是我写的。它们是内存位置吗?或垃圾值?

Java 以什么格式写入文件。因为,C 按照底层平台的 native 顺序读取,所以我尝试使用 ByteBuffer。如果我使用 DataOutputService,我认为 Java 以“BIG_ENDIAN”格式写入,而 C 可能无法读取正确的值。

此外,在这种情况下如何写入和读取字符串。 Java默认使用UTF-8,因此,我没有直接使用FileOutputStream,而是将它们转换为ASCII格式的字节,以便我可以逐个字符地读取它们。但是,没有显示输出。我什么时候可以使用fscanf(fp,"%s",string)(string是一个分配有足够内存的char数据类型变量)*?

<小时/>

理想的解决方案是 Java 能够按特定顺序写入数据,而 C 能够使用 fscanf() 读取数据,因此更容易识别整数/ float /字符串.

最佳答案

我的 Java 有点生疏,但看起来你要写入文件的是三个 4 字节整数,按顺序排列,并且按照字节的机器顺序(所以可能是小端)。这意味着您的文件应该包含(十六进制):

9a 00 00 00 62 00 00 00 06 00 00 00

但是您的扫描期望将数字视为空格分隔的文本,例如(十六进制)

31 35 34 20 39 38 20 36 0a

您可能应该使用类似 fread() 的东西,它不进行解析:

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

目标应该是类似 int[3] 的地址。

关于java - 如何从 Java 编写的文件中读取 C 语言的数据(二进制或文本)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55934779/

相关文章:

file - 我可以从 Tcl 中的文件句柄中找到文件名吗?

在 C 中将字符串转换为 float ?

java - Android 根据国家/地区运行不同的功能

java - 将字符串拆分为数组,然后再次拆分数组

java - Onclick事件导致随机FC

java - Yandex API 地理编码

c++ - 网络摄像头校准

c++ - 如何使用 GCC 编译指示启用选项 '-Werror'?

c - Sun Studio 编译器 : implicit function declaration: typeof

c - 在 c unix 编程中,只允许在一个进程中使用 open() 打开文件