用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;
}
我不明白我所看到的。共有三个值,但都不是我写的。它们是内存位置吗?或垃圾值?
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/