- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想使用 printArea() 将数组打印到文件中,使用 scanArea() 我想精确地扫描这个文件并将其粘贴到我的数组中。
所以从逻辑上讲,如果我执行 printArea() 和 scanArea(),我应该得到与以前相同的结果?好吧,不。我有一些换行符。对我的代码有什么想法吗?
int m = 0;
int n = 0;
int c = 0;
void printArea (int len, char p[][len])
{
FILE *out = fopen ("spielfeld.txt", "w");
for (int i = 0; i < len; i++)
{
for (int j = 0; j < len; j++)
fputc(p[i][j], out);
fputc(10, out);
}
fclose(out);
}
int scanArea (int len, char p[][len])
{
FILE *in = fopen ("spielfeld.txt", "r");
if (in == 0)
return 1;
else
{
while ((c=fgetc(in)) != EOF)
{
if ((c=fgetc(in)) == 10)
{
c++;
m++;
n = 0;
}
p[m][n] = (c=fgetc(in));
n++;
}
return 0;
}
fclose(in);
}
调用者:
int len;
len = 12;
char arr[len][len];
showArea (len, arr);
printArea(len, arr);
scanArea (len, arr);
showArea (len, arr);
第一个和第二个showArea不同。
111111111111
111111111111
111111111111
111111111111
111111111111
111111111111
111111111111
111111111111
111111111111
111111111111
111111111111
111111111111
111111111111
1111
1111111
1111
1111111
1111
1111111
1111
1111111
111111111111
111111111111
111111111111
111111111111
111111111111
111111111111
111111111111
最佳答案
scanArea()
中的主循环有问题。目前是:
while ((c=fgetc(in)) != EOF)
{
if ((c=fgetc(in)) == 10)
{
c++;
m++;
n = 0;
}
p[m][n] = (c=fgetc(in));
n++;
}
循环条件读取一个字符。 if 语句立即读取下一个字符,丢弃第一个字符。然后,您又读取了另一个字符以分配给数组,同时也放弃了第二个字符。这意味着您跳过了三分之二的字符。当它是换行符时,您还会增加 c
,这很奇怪且毫无意义。换行应该写成 '\n'
而不是 10。
你需要一些不太热衷于阅读字符的东西:
while ((c = fgetc(in)) != EOF)
{
if (c == '\n')
{
m++;
n = 0;
}
else
p[m][n++] = c;
}
这还是有点危险的;它会将除换行符之外的任意数量的任何类型的字符存储到数组中,而不用担心数组的边界,无论是在单行上还是在总行数上。但它不会跳过三分之二的数据。
进一步查看,我发现 m
、n
和 c
显示为全局变量;它们应该是 scanArea()
的本地。您应该尽可能避免使用全局变量。必要时,应在文件中将它们设为static
,除非它们真的必须在源文件之间共享。那么您需要遵循 How do I use extern
to share variables between source files 中的指南以确保一切一致。
There is only one
scanArea()
andm
,n
andc
are only used there.
那么他们就没有本地化的借口。实际上,如果您两次调用 scanArea()
,这些变量是全局变量的事实意味着在第二次调用时,索引将从超出范围的数组位置开始,并且会变得更糟从那里开始。
我将函数设置为static
,直到证明它们需要在另一个源文件中可见。不是每个人都像我一样对此保持肛门保持。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static void printArea(int len, char p[len][len])
{
FILE *out = fopen("spielfeld.txt", "w");
for (int i = 0; i < len; i++)
{
for (int j = 0; j < len; j++)
putc(p[i][j], out);
putc('\n', out);
}
fclose(out);
}
static int scanArea(int len, char p[len][len])
{
FILE *in = fopen("spielfeld.txt", "r");
if (in == 0)
return 1;
else
{
int m = 0;
int n = 0;
int c;
while ((c = getc(in)) != EOF)
{
if (c == '\n')
{
m++;
n = 0;
}
else if (n >= len || m >= len)
{
fprintf(stderr, "Accessing array out of bounds at p[%d][%d]\n", m, n);
exit(1);
}
else
p[m][n++] = c;
}
}
fclose(in);
return 0;
}
static void showArea(int len, char p[len][len])
{
for (int i = 0; i < len; i++)
{
for (int j = 0; j < len; j++)
putchar(p[i][j]);
putchar('\n');
}
}
int main(void)
{
int len = 12;
char arr[len][len];
memset(arr, '1', len * len);
puts("Before:");
showArea(len, arr);
printArea(len, arr);
scanArea(len, arr);
puts("After:");
showArea(len, arr);
}
在 Mac OS X 10.10.1(使用 GCC 4.8.1 编译)上运行时,我得到输出:
Before:
111111111111
111111111111
111111111111
111111111111
111111111111
111111111111
111111111111
111111111111
111111111111
111111111111
111111111111
111111111111
After:
111111111111
111111111111
111111111111
111111111111
111111111111
111111111111
111111111111
111111111111
111111111111
111111111111
111111111111
111111111111
All works, except my 8th line is completly blank, so now I got 13 lines instead of 12.
我无法解释你空白的第 8 行。
我注意到文件名重复了;重复文件名之类的东西会导致错误。理想情况下,应修改代码,以便将要使用的文件名传递给读写函数,调用代码应提供该名称。然而,这有点超出了当前问题的范围。
另请注意,如果 showArea()
被修改为采用文件流参数 (void showArea(FILE *fp, int len, char p[len][len])
和 I/O 调用进行了适当的修改,然后 printArea()
中的代码可以修改为打开文件,调用 showArea()
,然后关闭文件。
关于c - 从文件中精确打印和扫描 (C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27475345/
感觉我在这里遗漏了一些明显的东西,所以提前道歉。无论如何,这是我尝试转换的一些数据a: acct_num year_prem prem exc 001 20
我正在尝试将表中的模式与用户话语 匹配。 string userUtterance = "I want identification number for number of customers";
当尝试在 Precise 上链接 gccgo 时,出现此链接错误: matt@matt-1005P:~/src/gopath/src/meme$ gccgo cmd/meme/main.go -o m
假设我有以下数据和命令: clc;clear; t = [0:0.1:1]; t_new = [0:0.01:1]; y = [1,2,1,3,2,2,4,5,6,1,0]; p = interp1(
假设我有以下数据和命令: clc;clear; t = [0:0.1:1]; t_new = [0:0.01:1]; y = [1,2,1,3,2,2,4,5,6,1,0]; p = interp1(
我总是想给精确匹配比只匹配前缀的分数更高的分数(例如,“ball”在与“ball*”匹配时应该比“ballistic”得到更高的分数)。 我当前(详细)的方法是在创建 PrefixQuery 时始终执
有什么解决方法可以让我在 Android 中使用 long 或 double 来寻找音频文件中的位置吗?目前 seekTo 只接受 ints 参数。我想更精确(比如在十分之一秒内) int resID
我的 replacingOccurrences 函数有问题。我有一个这样的字符串: let x = "john, johnny, johnney" 我需要做的只是删除“john” 所以我有这段代码:
我正在使用 BeautifulSoup 进行网页抓取。我有这段代码来提取 a 标签的值,但它似乎不起作用。显示错误: AttributeError: 'int' object has no attri
我要在带有标记顶点和标记有向边的图上寻找一种不精确的图匹配算法。我的任务是检测两个图表的变化以将它们显示给开发人员(想想颠覆差异)。我已经实现了基于禁忌搜索 ( this ) 的优化算法,但我无法让该
我有两个网站: example.com 和 yyy.com 他们都有类似的网络应用程序,但在不同的服务器上。我想让 Apache 将所有路径请求重定向到 example.com 与 完全相同的方式yy
因此,我尝试合并两个公司信息数据库(从现在起表 A 和表 B),其中最常见(且可靠)的单一引用点是网站 URL。表 A 已更新,表 B 待更新。 我已经从表 A 中提取了 URL,并使用 PHP 清理
我正在 http://classicorthodoxbible.com/new.html 上制作效果主要描述中的 Angular 色,包裹在自己的跨度中,从他们通常的休息地点移动到随机位置,然后通过指
我目前正在使用我的 Raspberry Pi 及其内置 UART 输入编写 MIDI 合成器。 在某个时间点,为了启用 MIDI 输入的实时回放,我必须设置一种环形缓冲区以与 OpenAL 一起使用,
在 C 中,当设置了一个 float 时, int main(int argc, char *argv[]) { float temp = 98.6f; printf("%f\n",
实现 MP3 无间隙循环的最佳可能性是什么?目前我正在使用 AVAudioPlayer 并将 .numberOfLoops() 属性设置为 -1 但可以听到,轨道重新启动。情况并非如此,例如使用 Tr
我想创建不一定是“正确”矩阵的“类矩阵”对象。但是,确切地说,“类矩阵”是什么意思? 示例 1 > image(1:9) Error in image.default(1:9) : argument
给定一个像这样的 XML 文档: john &title; 我想解析上面的 XML 文档并生成其所有实体已解析的副本。因此,给定上述 XMl 文档,解析器应输出: john
需要说明的是,这种方法不是我要找的: 事实上,此方法会调整 ImageField 的大小。我想将 Image 对象的大小调整为特定且精确的无比例分辨率。有什么办法吗? --编辑-- 对我来说,Ima
我正在尝试使用 TF2.0 eager 模式执行精确的 GP 回归,基于来自 https://colab.research.google.com/github/tensorflow/probabili
我是一名优秀的程序员,十分优秀!