我正在尝试编写一个程序,该程序必须在2D阵列中存储ASCII图像(每行具有不同的长度),然后再将其打印出来。要么我必须在“\ n”切割数组,要么我必须创建一个动态大小的数组。这是我到目前为止所拥有的。它以正确的方式打印出来,但每行有255个字符。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#define MAX_LENGTH 255
int main(void) {
FILE *iFile, *oFile;
char elements[MAX_LENGTH][MAX_LENGTH];
memset(elements, 0, MAX_LENGTH);
int zeile = 0, position = 0, size = 0;
char c;
bool fileend = false;
//open files
iFile = fopen("image.txt", "r");
oFile = fopen("imagerotated.txt", "w+");
if ((iFile == NULL) || (oFile == NULL))
{
perror("Error: File does not exist.");
exit(EXIT_FAILURE);
}
//read File to a 2D-Array
while (1) {
if ((c = fgetc(iFile)) != EOF) {
if (c == '\n') {
zeile++;
position = 0;
}
elements[zeile][position] = c;
position++;
}
else {
fileend = true;
}
if (fileend == true) {
break;
}
}
//Write 2D-Array into the output file
fwrite(elements, MAX_LENGTH, MAX_LENGTH, oFile);
fclose(iFile);
fclose(oFile);
return EXIT_SUCCESS;
}
所以我的问题是打印出一个数组并在“\ n”处剪切每一行的最佳解决方案是什么? (或者创建一个动态长度/大小的数组)。
我想创建一个int countRows并在fileend变为true时从'zeile'获取数字,但是我如何获得countColoumns?
主要目标是以90度的步长旋转ASCII图像,但我卡在输出端。所以我必须使用2D阵列,这样我就可以轻松交换字符。 谢谢你的帮助。
答案 0 :(得分:1)
I,
您可以尝试制作一个类似原型的函数:
char **myFileToArray(char *contentOfFile);
此功能的目的是创建一个包含图片每一行的数组。 在此函数中,您计算行数(='/ n'的数量),您可以使用此大小创建动态数组。对于数组的每个维度,您可以动态分配行的长度加上'/ 0'的长度。您将线条复制到维度中,并将“/ 0”放在维度的每一端。 在此之后你可以返回你的数组。
例如,如果您的文件是:
1. /\_/\
2. =( °w° )=
3. ) ( //
4. (__ __)//
你将有一个大小为5的数组:
array[0] = " /\_/\"
array[1] = "=( °w° )="
array[2] = " ) ( //"
array[3] = " (__ __)//"
array[4] = "/0"
对于打印,您可以创建另一个写入数组的函数,将每个'/ 0'替换为'/ n'。
这个解决方案有点复杂,但我认为它仍然是一个解决方案和一个干净的解决方案。
我希望我的解释清楚地表示对不起我的英语,我试图改进!
答案 1 :(得分:1)
要将数组数据写入fwrite
的二进制文件,您需要知道要编写的字符数。你关心的只是所用字符的数量(或你的情况下使用过的行),而不是数组中未初始化/空的部分。您可能还希望将行数和每个数组元素的大小写为文件的前两个值,这样您就可以知道要读回多少个x-size数组。 (处理字符串,如果你选择,你也可以将空终止字符写入文件)如果你有numlines
行作为unsigned int
,那么类似char
的类似{{{ 1}} sizeof (char) = 1
:
unsigned maxl = MAX_LENGTH;
fwrite (&numlines, sizeof numlines, 1, oFile);
fwrite (&maxl, sizeof maxl, 1, oFile);
fwrite (elements, MAX_LENGTH, numlines, oFile);
然后读回来,你读取前2个unsigned int值,这个值是从文件中读回的数组(或行)大小。
如果元素包含char
以外的其他内容sizeof type > 1
,那么您可以将fwrite
和maxl
的{{1}}更改为(例如int):
elements
或最后一行通常会被视为:
unsigned maxl = MAX_LENGTH * sizeof (int);
...
fwrite (&maxl, sizeof maxl, 1, oFile);
fwrite (elements, MAX_LENGTH * sizeof (int), numlines, oFile);
目标是以一种您可以轻松读回的方式编写文件(或记录)。了解元素的数量和大小,并将这些作为写入文件的前两个数字保存,这样您就可以查询保存值所需的大小/类型的文件,然后将它们读回程序并验证您的读数。
除了额外的努力之外,您还可以编写一个锯齿状数组,只需在输出中的每一行之前包含要读取的字符数(或字节数)。这将允许您在文件中写入一些不均匀大小的元素组,从而在此过程中保存一些文件大小。