我正在编写一个c ++程序来读/写一个大文件(可能大于60GB).通过谷歌搜索问题,似乎32位系统中的文件io有2GB限制(我使用的是Windows 7 64位,但我的程序是用mingw32编译的).在我的程序中,我一次向文件写入10个整数,所有这些数字都是根据某些算法随机生成的.即使文件大小超过40GB,程序似乎也可以运行,但是我无法检查程序读取的数据是否真的是存储在文件中的数据或一些垃圾数字.但无论如何,该程序不会报告任何警告或错误.这是否真的可以在32位程序中读/写大于60GB的文件?
所以,我一直在使用JPIB与我的java程序中的GPIB设备进行通信.但是,我遇到了麻烦.较新的系统基于64位操作系统.但是,jpib.dll文件是用32位编写的.我想不出它需要做出的真正64位依赖的任何类型的调用.
真正的麻烦在于,自2006年9月以来,JPIB项目还没有更新.我曾尝试通过SourceForge向开发者发送电子邮件,但我认为我不会随意使用它.
有没有人知道这方面的任何方法?或者知道如何(并且可以告诉我如何)将.dll重新编译为AMD-64合规性?
我知道溢出普通代码是可能的:
char string [9];
scanf("%s",string).
但是有可能溢出scanf("%8s",字符串)?图8只是一个例子.
我知道"%8s"的作用类似于分隔符,但我也注意到当我输入超过8个字符的字符串时,程序将因以下原因而终止:
*堆栈粉碎检测*:./a.out终止
======= Backtrace:=========
...
显然,有一个标志可以检测GCC默认启用的堆栈粉碎.由于这是一个堆栈粉碎,我的猜测是仍然可以溢出并执行任意代码.
与正常溢出相反,会破坏scanf的调用者("%s"),如果scanf("%8s")可能溢出,它将在scanf函数内溢出,以便当scanf尝试返回时,获得控制权.
但是scanf是一个需要模式切换的系统调用(从用户模式切换到内核模式),并且在内部它会调用诸如read之类的东西到stdin等.所以不确定我们是否可以在内核模式或其他东西溢出.
欢迎评论!!
更新>>
在上面的例子中假设了char字符串[9].以下实际代码中的字符串[8].
问题实际上是关于安全扫描("%8s")和GCC流产之间由于堆栈粉碎而看似矛盾的故事.
简化代码:
void foo(pass some pointer) {
char input[8];
int input_number = 0;
while (1) { // looping console
printf some info;
scanf("%8s", input);
input_number = atoi(input);
if ((strlen(input) == 1) && (strncmp(input, "q", 1) == 0)) {
input_number = -1;
}
switch (input_number) {
case -1: to quit the console if input = 'q';
default: to print info that pointer refers …Run Code Online (Sandbox Code Playgroud) 任何人都可以给我一个代码,它将返回Windows内核驱动程序的System32目录的完整路径?
例如,如何获取/usr/lib/libz.a的版本?如果可以获取其他有用的信息,例如编译器/ arch等,那将是很好的.
我想知道这个的原因是gcc总是说当我编译我的程序并与特定的版本化libz链接时,它忽略了我在命令行中提供的libz.gcc认为/usr/lib/libz.a是一个合适的.
我导入"math.h".
我可以使用cos函数,但是当我执行cos(0.321139585333178)
结果时0.948876
如果我在Mac中使用计算器或使用普通计算器,结果是 0.999984292347418
任何人都可以帮我解决这个问题吗?
我正在尝试使用Visual Studio 2008,因为我在XCode中打开文件时遇到问题.我是VS的新手,但这些是我采取的步骤.我创建了一个新项目,选择了Win32 Console Application,空项目.我的代码是:
// C_test.cpp : Defines the entry point for the console application.
//
#include <stdio.h>
#include <stdlib.h>
int main(void )
{
printf("Hello");
FILE *filePtr;
filePtr = fopen( "test.txt", "r" );
if (filePtr == NULL)
{
fprintf(stderr, "Can't open \"test\"\n");
exit(EXIT_FAILURE);
}
else
{
int x;
printf("File open successful\n");
/* read one character at a time until EOF is reached */
while ((x = fgetc(filePtr)) != EOF)
{
//printf("%c", x);
fprintf(stderr, "%x\n",x);
}
}
fclose(filePtr);
system("pause");
return …Run Code Online (Sandbox Code Playgroud) 我想将一个目录及其下的两个文件复制到共享存储的另一个共享位置.是否可以将三个(一个目录和两个文件)组合为连续文件并在另一侧进行分解以节省成本?我只限于c语言和Unix/Linux.我正在考虑使用inode信息创建一个结构并在接收器处获取数据.
谢谢!