c - C如何将一个选项卡排序为多个选项卡
问题描述
我目前正在尝试将一个选项卡分类为多个选项卡。重点是“重新创建”乐透纸板,例如:
所以基本上我是从一个这样排序的 txt 文件中获取我所有的数字:
00001;12;26;37;52;66;02;18;27;53;76;09;38;48;61;82
00002;29;40;67;70;85;02;14;48;54;65;13;28;30;75;89
我需要获取它们,将它们保存到一个选项卡中,然后将它们分类到多个选项卡中,以便正确获取它们。最后我必须将它们导出到一个 csv 文件中,这在这里并不难。
我尝试了很多东西,都是徒劳的。在这里,我可以获取我的所有数据,将它们保存到一个选项卡中。现在我必须将它们分成 9 个值的三个选项卡,并比较三个选项卡之间的值,以使其像乐透纸板一样。*示例:如果选项卡的第一列的值 > 10,我必须将值移到下一列并在前一列中输入 0。就像乐透纸板一样。到目前为止,这是我的代码:
#include <stdlib.h>
#include <stdio.h>
#define Taille_Max 28
#define NBLIGNES 3
//Déclaration variables
FILE* fichierTxt = NULL;
FILE* fichierCsv = NULL;
int chaine[Taille_Max] = { 0 };
int i = 0;
struct carton {
char* numeroCarton[5];
int ligne1[9] = { 0 }, linge2[9] = { 0 }, ligne3[9] = { 0 };
};
int main()
{
//Creation carton
struct carton Carton;
//Ouvre fichier lecture et ecriture
fichierTxt = fopen("DESCAR.txt", "r");
fichierCsv = fopen("DESCAR.csv", "w");
//T fichierTxt
if (fichierTxt != NULL) {
for (i = 0; i < NBLIGNES; i++) {
//Recupere toute la chaine
fscanf(fichierTxt, "%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d", &chaine[0],
&chaine[1], &chaine[2], &chaine[3], &chaine[4], &chaine[5], &chaine[6], &chaine[7], &chaine[8], &chaine[9],
&chaine[10], &chaine[11], &chaine[12], &chaine[13], &chaine[14], &chaine[15]);
for (int c = 0; c < sizeof(Carton.ligne1); c++) {
if ()
Carton.ligne1[c] = chaine[c];
}
printf("%d %d %d %d %d %d %d %d %d", Carton.ligne1[0],
Carton.ligne1[1], Carton.ligne1[2], Carton.ligne1[3], Carton.ligne1[4], Carton.ligne1[5], Carton.ligne1[6], Carton.ligne1[7], Carton.ligne1[8]);
/* if (chaine[1] > 10 || chaine[5] > 10 || chaine [10] > 10) {
for (int n = sizeof(chaine) ; n > 0; n--) {
chaine[n+1] = chaine[n];
}
chaine[1] = 0;
chaine[5] = 0;
chaine[10] = 0;
}
if (chaine[2] > 20 || chaine[6] > 20 || chaine[11] > 20) {
for (int n = sizeof(chaine); n > 0; n--) {
chaine[n + 1] = chaine[n];
}
chaine[2] = 0;
chaine[6] = 0;
chaine[11] = 0;
}
//Affiche la chaine
printf("%d\n %d %d %d %d %d\n %d %d %d %d %d\n %d %d %d %d %d\n\n", chaine[0],
chaine[1], chaine[2], chaine[3], chaine[4], chaine[5], chaine[6], chaine[7], chaine[8], chaine[9],
chaine[10], chaine[11], chaine[12], chaine[13], chaine[14], chaine[15]);
}
fclose(fichierTxt);
}
else {
printf("Impossible d'ouvrir le fichier txt");
}
// fichierCSV
/*if (fichierCsv != NULL) {
fputs(chaine, fichierCsv);
}
else {
printf("Impossible d'ouvrir ou d'écrire dans le fichier");
}
*/
return 0;
}
解决方案
好的,这就是我将如何处理这个问题。
顺便说一句,当您说“tab”时,您要查找的词是“array”。
假设(我不熟悉宾果/乐透卡!):
- 卡片每行正好有五个数字
- 卡片数据按数字升序预先排序
- 卡数据不包含重复的数字
- 卡数据几乎都是有效的(您没有提供格式错误的条目示例)
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
typedef struct card card;
struct card {
int id;
int num[3][5];
card *nxt_card;
};
int main(int argc, char *argv[]) {
FILE *fileTxt = NULL;
FILE *fileCsv = NULL;
card *first_card = NULL;
fileTxt = fopen("cards.txt", "r");
fileCsv = fopen("cards.csv", "w+"); // create file if it doesn't exist
if(fileTxt) {
char buffer[128];
while(fgets(buffer, sizeof(buffer), fileTxt)) { // read line-by-line
if(strlen(buffer) <= 3) continue; // skip blanks
card c; // format data into a struct on the stack
memset(&c, 0, sizeof(card));
if(sscanf(buffer, "%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d", &c.id, &c.num[0][0], &c.num[0][1], &c.num[0][2], &c.num[0][3], &c.num[0][4],
&c.num[1][0], &c.num[1][1], &c.num[1][2], &c.num[1][3], &c.num[1][4], &c.num[2][0], &c.num[2][1], &c.num[2][2], &c.num[2][3], &c.num[2][4]) < 16) {
printf("Could not process a card.\n");
continue;
} else {
// copy the struct to the heap
card *s = malloc(sizeof(card));
if(s) {
memcpy(s, &c, sizeof(card));
if(!first_card) {
first_card = s;
} else {
card *i = first_card;
while(i->nxt_card) i = i->nxt_card;
i->nxt_card = s;
}
s = NULL;
} else {
printf("Memory allocation error!\n");
continue;
}
}
}
fclose(fileTxt);
if(!fileCsv) printf("Error opening CSV file for writing.\n");
// traverse the linked list
card *c = first_card;
while(c) {
// test for duplicate numbers in a card here, if required!
printf("\nCard #%05i:\n", c->id);
if(fileCsv) fprintf(fileCsv, "%05i\n", c->id);
for(int row=0; row<3; row++) {
// sort row elements ascending here, if required!
int l = 0; // keep track of numbers per row
for(int col=0; col<9; col++) {
if(l == 5) { // print empty columns after 5 numbers are in a row
printf("| ");
} else {
if((c->num[row][l]) < (col+1)*10) {
// print the lth element in its appropriate column
printf("|%2i", c->num[row][l]);
if(fileCsv) fprintf(fileCsv, "%i", c->num[row][l]);
l++;
} else printf("| "); // print empty middle columns
}
if(fileCsv && col<8) fprintf(fileCsv, ","); // skip empty extra column in csv
}
printf("|\n"); // next row (with dividers in middle)
if(row < 2) printf("----------------------------\n");
if(fileCsv) fprintf(fileCsv, "\n");
}
if(fileCsv) fprintf(fileCsv, "\n");
c = c->nxt_card;
}
printf("\n");
if(fileCsv) fclose(fileCsv);
// free allocated heap
card *i, *j;
for(i = first_card; i != NULL; i = j){
j = i->nxt_card;
free(i);
}
i = NULL; j = NULL;
} else printf("Could not open the cards data file.\n");
return 0;
}
卡片.txt
00001;12;26;37;52;66;02;18;27;53;76;09;38;48;61;82
00002;29;40;67;70;85;02;14;48;54;65;13;28;30;75;89
标准输出
Card #00001:
| |12|26|37| |52|66| | |
----------------------------
| 2|18|27| | |53| |76| |
----------------------------
| 9| | |38|48| |61| |82|
Card #00002:
| | |29| |40| |67|70|85|
----------------------------
| 2|14| | |48|54|65| | |
----------------------------
| |13|28|30| | | |75|89|
卡片.csv
00001
,12,26,37,,52,66,,
2,18,27,,,53,,76,
9,,,38,48,,61,,82
00002
,,29,,40,,67,70,85
2,14,,,48,54,65,,
,13,28,30,,,,75,89
推荐阅读
- c++ - 为什么我可以使用 std::map 而不是 std::unordered_map 进行循环引用?
- c# - ASP.NET db.savechange System.Data.Entity.Infrastructure.DbUpdateException
- jquery - 在 jQuery UI Sortable 中,第一个和最后一个可排序项目不会一直移开
- php - 在woocommerce的PDF发票中获取HSN代码
- javascript - 在赛普拉斯中,如何检查最新响应的标头?
- reactjs - React 设计模式困境 - 数字表单组件中的步进器
- angular - 为什么我会收到“错误 TS1005:';' 预期的。” 运行简单的 Jasmine 测试时出错?
- angular - 如何将 i18n 与作为 Angular 对象的组件输入一起使用?
- django - 在 Wagtail 如何为某些用户禁用某些管理菜单项?
- javascript - 我希望我的图像在每次 dblclick 时消失