我正在尝试调试操作文件的程序.例如,我将文件指针设置为偏移量4(使用0的基数),但它似乎从偏移量5开始.
为了弄清楚发生了什么,我想在一行中打印出当前文件指针(我没有为这个小项目使用IDE,只是Notepad2和命令行).不幸的是,似乎没有Windows API函数来检索当前文件指针,只有一个来设置它.
我记得能够在Pascal中找到当前文件指针(在DOS中),但是如何在Windows中用C++确定当前文件指针?
我在某处看到过这段代码:
#include<stdio.h>
int main()
{
FILE * fp;
char s[1024];
fp = fopen("file","r");
while( fscanf(fp, "%s", s ) != EOF )
{
puts(s);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我预计这将继续无限循环地打印文件的第一个单词。我相信文件指针被视为输入只是为了获取应该读取输入的点,而 fscanf 将有一个本地文件指针,它将用来读取文件。
但在运行时我意识到它实际上打印了整个文件。我能得出的唯一结论是,在读取第一个输入后,它实际上将传递的文件指针向前移动,否则它只会一次又一次地继续打印第一个单词。
我看到了fscanf 的man 文档,但在阅读后找不到有关文件指针移动的任何内容。
有人可以解释一下或给出一个来源,其中指定传递的文件指针在读取后实际上会移动吗?
最初,我有一个简单的程序将整个输出打印到控制台。
初始代码仅在控制台中显示输出
import os, subprocess
print("1. Before")
os.system('ver')
subprocess.run('whoami')
print('\n2. After')
Run Code Online (Sandbox Code Playgroud)
在控制台中输出
1. Before
Microsoft Windows [Version 10]
user01
2. After
Run Code Online (Sandbox Code Playgroud)
然后,我决定在保持控制台原始输出的同时,在日志文件(log.txt)上复制一份。
因此,这是新代码。
import os, subprocess, sys
old_stdout = sys.stdout
log_file = open("log.txt","w")
sys.stdout = log_file
print("1. Before") # This appear in message.log only, but NOT in console
os.system('ver') # This appear in console only, but NOT in message.log
subprocess.run('whoami') # This appear in console only, but NOT in message.log
print('\n2. After') # This appear in message.log only, but NOT …Run Code Online (Sandbox Code Playgroud) 我有个问题:
我正在使用fread来读取文件.
typedef struct {
int ID1;
int ID2;
char string[256];
} Reg;
Reg *A = (Reg*) malloc(sizeof(Reg)*size);
size = FILESIZE/sizeof(Reg);
fread (A, sizeof(Reg), size, FILEREAD);
Run Code Online (Sandbox Code Playgroud)
使用循环,连续调用此调用,让我读取整个文件.
当我接近文件的末尾会发生什么,我无法读取"size"*sizeof(Reg),或者如果你只能读取这个数量的一半,那么我的数组A会发生什么.它会是完成?该函数将返回错误?
知道如何通过fread读取文件?
Edi1:确切地说,如果除法不精确的话,当我读到最后一点较小的文件大小时,我将读取未存档的内容,我想知道我的向量调整大小为我可以读取的字节数,或者发展更好的动态.
例如,如果我们声明一个文件指针fp并打开一个文件,如下所示:
FILE* fp = fopen("filename","w");
如果文件未打开,fopen则返回NULL到文件指针fp。如果文件打开,文件指针中存储什么fp?
出于某些原因,我需要一个指向任何内容的文件指针(FILE*).这意味着我可以将它传递给fprintf函数并且fprintf忽略文件指针.
例如:
void my_function()
{
FILE* nothing = NULL; // NULL is not correct.
int n = fprintf(nothing, "PI = %f", 3.14); // Note: When nothing = NULL, error ocured.
}
Run Code Online (Sandbox Code Playgroud)
是否有指向空的文件指针(FILE*)?
假设我有以下代码:
FILE *x = fopen("story.txt",r);
if(x!=NULL)
{
x = fopen("story.txt",wb); /* <- Does this waste/leak memory ?? */
/* ... do something .... */
/* if(fclose(x)==EOF)...else... */
}
else
{
printf("story.txt does not exist\n");
}
Run Code Online (Sandbox Code Playgroud)
在这里,我将指针重新分配到story.txt在内存中创建缓冲区的位置,没有fclose(x),假设因为它是一个指针,内存区域将简单地被“新”缓冲区覆盖。这个假设准确吗?我是在泄漏还是浪费内存,还是这种方法可以?
因此,我正在阅读日历文件以在文件中插入日期,并且我希望日期保持按时间顺序排列.当我找到日期应该去的地方时,问题出现了,文件已经超过了我要插入的点.
我正在查看的日历文件如下所示:
# November 2010
11/26/2010
11/27/2010
11/28/2010
11/29/2010
11/30/2010
# December
12/24/2010
12/25/2010
12/26/2010
12/27/2010
12/28/2010
12/29/2010
12/30/2010
Run Code Online (Sandbox Code Playgroud)
我的代码看起来像这样:
while (my $line = <FILE>) {
if (substr($line, 0, 1) =~ m/\#/ || $line =~ m/calendar/) { #if the line is commented out or contains the calendar's name skip to next line
next;
}
chomp($line);
my ($temp_month, $temp_day, $temp_year) = split(/\//, $line, 3);
if ($year == $temp_year && $month == $temp_month && $day < $temp_day) {
?
}
}
Run Code Online (Sandbox Code Playgroud)
那么有关于如何指向文件中的前一个位置的任何建议吗?
对于给定的文件指针(FILE *),是否可以快速确定从当前位置到文件末尾的距离。
计算实际距离所需的时间不应取决于距离。
比如减法fpos_t,但是fpos_t不是整数,不能进行数值运算。有什么替代方法吗?
我有这样的代码:
std::string getInfo(FILE *fp)
{
char buffer[30];
if (fread(buffer, 19, 1, fp) == 1)
buffer[19] = '\0';
else
buffer[0] = '\0';
return buffer;
}
Run Code Online (Sandbox Code Playgroud)
我正在使用 cppcheck 进行静态分析,它会发出警告:
error: Resource leak: fp [resourceLeak]
return buffer;
^
Run Code Online (Sandbox Code Playgroud)
在我看来,由于返回是按值计算的,因此数据将从“缓冲区”复制到 std::string 的存储中,因此不会发生泄漏。
这会带来一些真正的问题还是误报?
file-pointer ×10
c ×5
c++ ×3
file-io ×3
windows ×2
cppcheck ×1
eof ×1
fclose ×1
file ×1
filehandle ×1
fopen ×1
fread ×1
perl ×1
position ×1
python ×1
python-3.x ×1
scanf ×1
subprocess ×1
visual-c++ ×1
winapi ×1