gpt4 book ai didi

c - 从一个文件读取并打印到另一个文件

转载 作者:行者123 更新时间:2023-11-30 19:40:18 25 4
gpt4 key购买 nike

我有一个文件 test.txt,如下所示:

5 6
sugli*
odiati
tiri*n
tri*cd
oe*poi

前两个数字是所有这些单词必须放入的数组维度。

以下任务的代码是(fileIntest.txt 文件):

int row, col;
fscanf(fileIn, "%d %d%*c", &row, &col);
int cruciverba[row][col];

for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
cruciverba[i][j] = fgetc(fileIn);
}
char space = fgetc(fileIn);
}

数组现已创建。现在我应该编写一个函数(或更多)将字符串写入另一个文件,但不是数组中的每个字符串,只是水平和垂直长度>= 2 的字符串。请注意,'*' 是字符串分隔符。目标是拥有一个包含以下字符串的output.txt 文件:

sugli
odiati
tiri
tri
cd
oe
poi

sotto
udire
giri
lai
it
co
indi

我知道如何输出字符串,但我不知道如何解决这个问题。有什么建议吗?

最佳答案

这个问题的目的是在多个层面上折磨你。从面向字符的输入、字符数组到字符串理解、数组索引、文本文件格式以及许多其他微妙的问题,这旨在迫使您专注于逐个字符的级别。

首先,您的数据文件包含数组边界,后跟 5 行,每个 7 个字符(您必须考虑到 '\n' 字符终止每行)。您的阵列存储为 5 行 x 6 列。这意味着从面向字符的输入角度来看,您必须考虑'\n'的读取,而从数据/索引的角度忽略它。

(注意:虽然问题的目的似乎是让您读入二维数组,但您可以将字符的 row*col 读入一维数组,如下所示好吧——这种方法也并非没有挑战)

将读取内容导航到数组后,您将面临输出数组,同时仅考虑 [A-Za-z] (alpha) 字符作为每行的 '*' 字符为 '\n',每行的末尾也为 '\n'

没有简单或正确的方法来解决这个问题。不管你怎么做,这都是你必须真正专注于索引体操的地方,以达到提供适当输出的例程。下面的方法使用 7-char 缓冲区和缓冲区索引来缓冲每个所需的字符,并在满足所有条件时将缓冲区写入 stdout(例如 >'*' 或到达行尾)。下面是解决该问题的一种方法的注释示例。我将操作的第二部分留给了您,但是通过此处和 BLUEPIXY 提供的示例,您有几个示例表明您必须处理索引。示例:

#include <stdio.h>
#include <ctype.h>

int main (int argc, char **argv) {

int row, col, i, idx, j, c;
FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;

if (!fp) { /* validate file open for reading */
fprintf (stderr, "error: file open failed '%s'.\n", argv[1]);
return 1;
}
row = col = i = idx = j = c = 0; /* initialize all values */

/* validate row and col data read */
if (fscanf (fp, "%d %d%*c", &row, &col) != 2) {
fprintf (stderr, "error: invalid read of row/col.\n");
return 1;
}

char cruciverbal[row][col]; /* variable length array to data */
char buf[col+1]; /* buffer to assist in printing */

for (i = 0; i < row; i++) { /* for each row in array */
for (j = 0; j < col; j++) { /* for each char in row */
if ((c = fgetc (fp)) == EOF) /* jump if EOF */
goto readdone;
else {
cruciverbal[i][j] = c; /* store char in array */
}
}
fgetc (fp); /* discard newline in file */
}
readdone:

if (fp != stdin) fclose (fp); /* close file if not stdin */

/* print characters to stdout */
for (i = 0; i < row; i++) {
for (j = 0; j < col; j++) {
if (isalpha (cruciverbal[i][j])) /* if [A-Za-Z] */
buf[idx++] = cruciverbal[i][j]; /* buffer char */
else {
if (idx > 1) { /* check if buffer > 1 */
buf[idx] = 0; /* nul-terminate buffer */
printf ("%s\n", buf);
idx = 0; /* reset buffer index */
}
else { /* if buf < 2, print \n */
fputc ('\n', stdout);
continue;
}
}
} /* if last char in row is [A-Za-z] */
if (isalpha (cruciverbal[i][j-1])) {
if (idx > 1) {
buf[idx] = 0; /* nul-terminate buffer */
printf ("%s\n", buf);
}
else if (idx == 0) /* if buffer empty */
fputc ('\n', stdout); /* output newline */
}
idx = 0; /* reset buf index */
}

return 0;
}

使用/输出

$ ./bin/cruciverbal <../dat/56array.txt
sugli
odiati
tiri
tri
cd
oe
poi

查看这两个答案,如果您有任何疑问,请告诉我们。

关于c - 从一个文件读取并打印到另一个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35468939/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com