读取 .txt 文件以更新已存储的 2D 字符数组,但不覆盖原始源有空格的位置

如何解决读取 .txt 文件以更新已存储的 2D 字符数组,但不覆盖原始源有空格的位置

所以我有一个非常令人困惑的问题。我被卡住了几天,所以我跳过了这一步来继续这个项目。为此,我将提供的 .txt 文件更改为显示我需要的输出,而不是继续尝试覆盖我内部详细的二维数组。

我很确定我无法提交修改后的 .txt,因此除非我能够解决这个问题,否则程序将无法运行。

我需要一种方法来将 .txt 文件内容复制到现有的二维数组上,但只更新具有字符的位置。 .txt 文件中的其他位置为空。

.txt 文件示例;

 f  g  s   f
a  b    c  d
  a  b   c d
   abc   d
 f  g  s   f
a  b    c  d
  a  b   c d
   abc   d
a  b    c  d
  a  b   c d
 f  g  s   f

我需要将它们复制到一个已经存储的 12x12 字符数组中,如下所示,

    char source[12][12] = {
    " ---------- ","|..........|"," ---------- ",};

我已经成功地使用下面的代码将 .txt 文件内容写入屏幕,所以我希望有一种方法可以向 for 循环添加一个方法来跳过 .txt 文件中的空白点并只更新.txt 文件中相同对应位置有字符时的二维数组。

我省略了一些细节和原因,因为它是一个作业,但如果它有帮助,.txt 文件中的字符只有 'o'、'b' 和 'blanks'。源和目标都是 12x12。


for (posX = 0; posX < 12; posX++) {

        for (posY = 0; posY < 12; posY++) {
            printf("%c",source[posX][posY]);
        }
        printf("\n");

感谢任何帮助,这让我很难过。

---编辑---

到目前为止非常感谢。

我已成功将 10x10 .txt 文件的副本复制到 12x13 阵列。进展..

好消息是我现在只需要担心 .txt 文件中的“”(空白)会覆盖“.”,所以这应该会更简单吗?

我还没有能够创建一个 if 语句来做到这一点。我已经尝试了一些东西,但我现在只是猜测,需要指向一个来源来阅读以了解如何告诉循环;

如果您在 .txt @ [posX][posY] 中看到(空白) - 不要更新源中的相同 [posX][posY] 并继续循环。

非常感谢任何帮助。最后一步也是最重要的一步,在我开始之前需要对它进行排序。

 ----------
|f  g  s   |
|a  b    c |
|  a  b   c|
|   abc   d|
| f  g  s  |
|a  b    c |
|  a  b   c|
|   abc   d|
|a  b    c |
|  a  b    |
 ----------

fptr = fopen("XXX.txt","r");

    for (posX = 1; posX < 11; posX++) {

        for (posY = 1; posY < 11; posY++) {

                fscanf(fptr,"%c",&source[posX][posY]);

        }
                fscanf(fptr,&newline);

        }
        fclose(fptr);
    }

解决方法

您只需要检查字符是否与空格字符' '不同,如果不同则插入它,如果它不继续循环。 我不知道你是如何访问文件的。但是循环中应该有类似这样的语句:

if(currentChar != " "){
  source[posX][posY]
}
,

由于 source 的大小太小而无法容纳其初始化程序,因此您到处都是 UB。字符串 |..........| 有 12 个字符长,因此它需要一个大小(至少)13 的数组来保存它。将您的初始化程序更改为:

char source[12][13] = {
    " ---------- ","|..........|"," ---------- "
};

如果您的代码要求数组的大小恰好为 [12][12],那么您不能对初始化程序使用字符串常量。你需要做更详细的:

char source[12][12] = {
    { ' ','-',' ' },{ '|','.','|' },{ ' ',' ' }
};

(或使用字符串常量初始化前 11 个字符,然后在运行时填充尾部,但这是一个坏主意。)

我不确定这是多么标准(我相信 ... 是一个 gnu 扩展),但一些编译器会允许:

char source[12][12] = {                                                            
    [0]         = { [0] = ' ',[1 ... 10] = '-',[11] = ' ' },[1 ... 10 ] = { [0] = '|',[1 ... 10] = '.',[11] = '|' },[11]        = { [0] = ' ',[11] = ' ' }                      
}; 
,

我认为主要问题在于您的数据接收技术。您正在做的是,您直接将数据放入您的数组中,而无需验证您的条件是否包含空格。

为了更正它,在你的循环中做一些更新......

char ch;
ch = fgetc(fptr); //get a character from file pointer...

回答你编辑过的部分,如果我正确理解你,你需要在循环中使用这种 if 语句来做同样的事情......现在检查条件以将数据保存在你的数组中。

if(ch == " " || ch == "\n" || ch == "\r" || ch == "\t" || ch == "\0")
{
//TODO:
// handle white spaces here and correspondingly '\n','\r','\t'...
// print or do whatever you want to do...
}
else
{
//here we have only characters and update it to corresponding position in array...
source[posX][posY] = ch;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?