- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我只是想对一组数字进行排序(虽然我发布的代码不是我要使用的方法,但我确实需要将代码中的输出写入二进制文件).
一切正常,除了“ordenar”的最后一次迭代:当我在订购后再次打印回数字时,除了最后一行之外的所有内容都已订购,我已验证 ordenar 已正确完成,并且 fwrite()
在最后一次迭代中返回值 10,但它似乎没有写入最后的输出。
代码是:
#define _CRT_SECURE_NO_DEPRECATE
#define SIZE 10
#define MAX 10
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
int numbers[SIZE];
int genera_numeros() {
unsigned long i, j;
FILE *file;
file = fopen("number.dat", "wb");
if (!file) {
perror("fopen");
return 1;
}
srand(time(0));
for (i = 0; i < MAX; i++) {
for (j = 0; j < SIZE; j++) {
numbers[j] = rand()%1000;
printf("%i ", numbers[j]);
}
fwrite(numbers, sizeof(int), SIZE, file);
printf("\n");
}
fclose(file);
return 0;
}
int imprime_numeros() {
unsigned long i, j;
int numbers[SIZE];
FILE *file;
file = fopen("number.dat", "rb");
if (!file) {
perror("fopen");
return 1;
}
for (i = 0; i < MAX; i++) {
fread(numbers, sizeof(int), SIZE, file);
for (j = 0; j < SIZE; j++) {
printf("%i ",numbers[j]);
}
printf("\n");
}
fclose(file);
return 0;
}
int compare (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}
int ordenar(FILE* file, long int num_bloque)
{
int byte=0, written=0;
fseek(file, num_bloque * sizeof(int) * SIZE, SEEK_SET);
fread(numbers, sizeof(int), SIZE, file);
qsort (numbers, SIZE, sizeof(int), compare);
fseek(file, num_bloque * sizeof(int) * SIZE, SEEK_SET);
byte=ftell(file);
written=fwrite(numbers, sizeof(int), SIZE, file);
return 0;
}
int main(int argc, char* argv[]) {
FILE *file;
file = fopen("number.dat", "rb+");
long int i;
genera_numeros();
printf("\n\n Los numeros son:\n\n");
imprime_numeros();
printf("\n\n Ordenando...");
for (i=0; i<MAX; i++)
{
ordenar(file, i);
}
printf("\n\n Los numeros son:\n\n");
imprime_numeros();
printf("\n");
fclose(file);
system("PAUSE");
return 0;
}
最佳答案
对于初学者来说,因为我不知道你的代码到底应该做什么,所以删除给你段错误的东西。
你关你file
都带有 imprime_numeros()
和在main()
.删除一个或另一个,您的程序就可以运行。
这是我对你的问题的解决方案,没有对最后一行进行排序。只需使用
for(i=0;i<MAX+1;i++){
并且有效。我目前正在研究解决方案的“为什么”部分。
编辑 1
我花了一段时间,但现在是这样:
在你的 main() 你有 FILE* file=fopen(..)
这是您唯一不检查它是否正确打开的地方。每次你的程序第一次运行时 - 它找不到那个文件和 file
在 main() 中设置为 NULL。
然后它愉快地继续并调用函数 genera_numeros()
它打开自己的文件(并创建 numbers.dat btw...)但在本地范围内,因为在 genera_numeros()
之外file
仍然是 NULL。
因此它创建一个文件,填充它并继续到 imprima_numeros()
打开之前创建的 numbers.dat
(仍在本地范围内,您在使用后关闭此文件)。
然后是ordenar
部分,事情开始变得有趣。
ordenar(file, i)
获取您的 NULL 文件并...因段错误而崩溃。
(有趣 部分,也是让我受骗的地方,这将不会在您第二次运行该程序时发生,因为 numbers.dat
将保留在上一次运行中)。
编辑 2. 最后是的,我只是花了 2 个非付费的深夜时间来查找其他人代码中的错误。我可能就是那个人……总之……
问题在于多次打开同一个文件。
Bu 我的意思是,当你通过打开不存在的文件修复以前的错误,或者只是第二次运行程序时,你在 main() 中打开一个文件,然后用 imprime_numeros
打开和关闭这个文件几次。和 genera_numeros
.那应该是 implementation-defined
行为。
问题是在你最后一次调用 ordenar()
之后在你的循环中你用 imprime_numeros
重新打开它并写入最后排序的行在磁盘上的文件中尚不可见。这将在您关闭文件流后完成。因此,在向文件写入排序的最后一行之前,您会看到文件的状态。
现在为什么我的 MAX+1
有效的解决方案是它强制永久写入最后一行,因此它在 imprime_numeros()
打开的文件中可见.
这就是几乎的全部。
请注意,通过添加 MAX+1,您将获得大小为 440 字节的文件(我有 4 字节 int),它应该是 400。
我也忘了提到如何解决这个问题,但你可以通过我的描述找到它。
提示
fclose(file) 在读取它之前。
所有正在阅读此答案的人,我将感谢您对语法和风格进行编辑。已经很晚了,这让我付出了很多代价。
关于c - fwrite 在最后一次迭代中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19413348/
我遇到一些 fwrite 问题,它以我不明白的方式失败。 在这段代码中,fwrite 都失败并给出 tmp = 0。 if ((file = fopen(filenameout, "wb")) !
好吧,事情是这样的……我记得上周创建了一个程序,要求我以二进制模式打开一个文件并向其中写入数据。首先,我尝试使用fopen函数,检查结果是否正确,然后尝试写入数据。我记得第一次尝试时,fwrite 操
早上好, 我正在尝试将以下结构的内容写入文件(更具体地说是 BMP 文件),并且想知道为什么 fwrite 的二进制输出ing 整个结构和 fwrite结构体的各个项目是不同的。这就是C的工作方式吗?
我在某个地方遇到了这个。 正在写入一个文件,然后rewind(fileptr) 完成,然后写入应该写入文件开头的内容。但是写在开头,不会覆盖文件的内容吗?请指教。 最佳答案 技术上,是 是的,文件将被
fwrite 一个整数取决于字节序,但是有没有一种方法可以将一个整数 0x00000004 写入一个文件,这样无论它运行在什么机器上,它都可以始终被读取为 0x00000004。 一个想法是始终按照特
我在 php 中编写一个函数,在客户端我有一个 Canvas 图像,我使用 toDataUrl() 和一个文件名将图像保存在服务器上。这是代码: 关键是这段代码有效。对于我在其上使用的三分之二的页面
当我运行这个小代码并在控制台上输入 3 个整数时,由于 fwrite 语句,它没有按应有的方式打印出来。只有在我连续按回车键一段时间后,它才会打印出来。帮助?P.S:学习速度比 scanf 和 pri
我的网站在 /var/www/html/hs/ ,我有我的更新.php .它应该写到/var/www/html/hs/json/myFile.json ,但事实并非如此。当我尝试写入 的同一目录时更新
这个函数应该获取一个参数作为文件的指针并将所有文件放入struct anagram ,然后将其写入另一个文件。现在每个数据之间都有很大的空间。 charCompare 工作正常,因为我制作了一个测试文
这是在我的网站上上传带有“var$”内容的“file.txt”的 URL: http://www.mywebsite.com/fwrite.php?stringData=var$&myFile=fil
如果字符串包含 ~,我似乎无法将其打印到标准输出。 > A = "/.git". > io:fwrite(A). /.gitok > B = "~/.git". > io:fwrite(B). **
我发现当我尝试写入一些大数据时 fwrite 失败,如下面的代码所示。 #include #include int main(int argc, char* argv[]) { int s
我正在写这个: $fh = fopen('public/newsletter.txt', 'w'); foreach($entries as $row) { fwrite($fh,
我又来了,这次有一个 PHP 问题...我正忙于制作某种管理面板(非常基本),但是当我试图像我的 slider 或其他东西一样进行更改时,fwrite 会覆盖所有内容。这是我的 PHP 代码: 0)
根据fwrite的手册页: fread() and fwrite() return the number of items successfully read or written (i.e., no
我只是想对一组数字进行排序(虽然我发布的代码不是我要使用的方法,但我确实需要将代码中的输出写入二进制文件). 一切正常,除了“ordenar”的最后一次迭代:当我在订购后再次打印回数字时,除了最后一行
我想使用 data.table::fwrite 以文本日志的形式快速存储和检索状态。这些是通过移动应用程序更新的,该应用程序使用管道工 API 调用到 R 端点。移动应用程序每秒可能会触发许多 API
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 5 年前。 Improve th
我正在尝试使用“fwrite”并制作 snd 文件。我想做 IIR 滤波器。我制作了一个 FIR 滤波器,并使用 IIR 滤波器的代码。(当然,改变系数)但我认为“fwrite”不起作用。因为IIR滤
我正在尝试将 wchar 数组写入 C 中的文件,但是存在某种损坏和不相关的数据,例如这样的变量和路径 c.:.\.p.r.o.g.r.a.m. .f.i.l.e.s.\.m.i.c.r.o.s.o.
我是一名优秀的程序员,十分优秀!